OSM(OpenStreetMap)タイル地図では、zoom 0 では世界全体を1枚のタイルで表す。 zoom 2 では縦横を二分割した 2x2=4枚のタイル、zoom 3 ではそれを更にに分割して 4x4=16枚のタイル で表す。
zoom 16、17、18 となると、日本地図だけでも何百万、何千万、何億万タイルという膨大なタイル数 となる。
個人利用では実際に見るタイル数は限られている。そのタイルを見るときに、 そのタイルの画像データを生成する場合にはタイル画像データを保存しておく必要はないが、 実時間でタイル画像を生成するには時間がかかるため、一度生成したタイル画像は保存しておきたい。
国土地理院地図の場合は端末側でタイル地図を生成するのではなく、サーバーからダウンロードする。 この場合も毎回サーバーにアクセスするのではなく、ダウンロードしたタイル画像を保存しておく。
OSM地図ではレンダリング、国土地理院地図ではダウンロードの負担が軽くなれば、 スマホの保存するタイル数は少なくできるが、現時点では簡単ではない。
個人利用では、少なくとも 10万、20万、できれば100万を保存しておけば、タイル地図を快適に表示できる。
128GB、256GBのマイクロSDカードを安価に手に入れられる時代になったので、 スマホにでも 100万、200万タイルを保存可能である。
階層ディレクトリを使えば、200万ファイルでも保存可能であるが、OSで何らかのスキャンが起きると その負荷は耐え難いものになる。 したがって、スマホでは、ZIPアーカイブやSQLiteデータベースなどを使って、ファイル数を減らす必要がある。
数年前には独自のアーカイブも使ったが、極力、広く普及している技術を使い、プログラムをシンプルにしたい。
OSM地図のレンダリング用のバイナリレコードはスマホではリードオンリーのため、ZIPで対応できた。 タイル画像では、追加や更新がある。追加は ZIPでも可能であるが、エントリの更新(取り換え)ができない。 このため、ZIPと階層ディレクトリを併用する。
まずは、階層ディレクトリにある全タイル画像ファイルを Zoom毎に ZIPにまとめる。
そのあと、追加や更新があったタイルは階層ディレクトリに置く。 ZIPにあるタイルが更新された場合、同じタイルアドレスの画像が2箇所にあるが、読み出しでは、 階層ディレクトリにあるものを優先する。
数か月に一度、ZIPファイルを作り直して階層ディレクトリを空にする。
ZIPの対象は png や Jpeg で圧縮された画像データであるため、ZIPとしては非圧縮とする。
現在の OSMタイル地図では、階層ディレクトリ 8.8万タイル、16.1GB、標準圧縮ZIPで 13.1GB、 非圧縮ZIPで 14.9GB となった。
標準圧縮では 12%程度の圧縮効果が得られたが、スマホではアーカイブ時間は10倍以上かかった。
ファイルサイズよりも処理時間重視のため、非圧縮ZIPを採用する。
OSMタイル地図はもともとはパソコン表示が前提であり、タイルは 256x256画素である。 高解像度のスマホではこれを拡大表示する案もあるが、小さな文字をきれいに表示するため、 768x768画素としている。これにより、ファイルサイズは大幅に増えている。
また、png よりも jpeg とした方がファイルサイズは小さくできる。
必要ならば、ファイルサイズを縮小する方法は色々ある。