Flatmap(Planetiler)で超高速に地図ベクタータイルを生成してみる
※ 2022/1/19 追記
ここで紹介している Flatmap は Planetiler という名前に変わったようです。
使い方は変わっていないようなので、以下はそのまま使えると思います。
先日、ローカル環境で地図を表示するOGP画像を生成するための方法を以下に投稿しました。
地図は OpenStreetMap を使い、その地図タイルをローカル環境で表示するためにOpenMapTilesでOSMデータをタイル化して使用しました。
問題点
先の投稿の方法でやりたかったこと(大量の地図画像ファイルをローカル環境で生成)は達成できました。しかし、OpenMapTiles を使った地図タイル生成のかなりの時間がかかることが懸念点として挙げられると思います。
私が日本国内のタイルをOpenMapTilesを使って生成したときは、完了まで48時間ほどかかりました。一度作成しておけば地図データを更新しない限りはやらなくていいとはいえ、丸2日動かし続けないといけないのはいろいろと辛いです。
OpenMapTiles と同じく OSM からベクタータイルを生成するツールとして Flatmap というのを見つけました。説明を読むと、生成する速さがウリ、なようなので試してみました。
Flatmap による OSM ベクタータイル生成
Flatmap と Docker を使って日本の地図タイルを作ってみます。
$ docker run -e JAVA_TOOL_OPTIONS="-Xmx5g" -v "$(pwd)/data":/data ghcr.io/onthegomap/flatmap:latest --download --area=japan
実行した結果のログは以下のようになりました。
0:35:47 INF - FINISHED!
0:35:47 INF - ----------------------------------------
0:35:47 INF - overall 2,147s cpu:4,651s avg:2.2
0:35:47 INF - lake_centerlines 0.8s cpu:3s avg:3.1
0:35:47 INF - water_polygons 30s cpu:78s avg:2.6
0:35:47 INF - natural_earth 13s cpu:18s avg:1.4
0:35:47 INF - osm_pass1 156s cpu:145s avg:0.9
0:35:47 INF - osm_pass2 801s cpu:1,999s avg:2.5
0:35:47 INF - boundaries 0.3s cpu:0.5s avg:1.7
0:35:47 INF - sort 148s cpu:119s avg:0.8
0:35:47 INF - mbtiles 893s cpu:2,269s avg:2.5
0:35:47 INF - ----------------------------------------
0:35:47 INF - features 5.5GB
0:35:47 INF - mbtiles 1.7GB
0:35:47
が処理時間ですが、36分弱と OpenMapTiles と比べて異様に早かったです。
ちょっとタイルが正常かどうか不安になるぐらいの速さです。
なので、OpenMapTiles と Flatmap で作成された地図タイルを比べてみることにしました。
OpenMapTiles と Flatmap の地図比較
まず、OpenMapTiles と Flatmap での日本のタイル生成時間を再掲します。
ツール | 時間 |
---|---|
OpenMapTiles | 2880分(48時間) |
Flatmap | 36分 |
Flatmap は OpenMapTiles の約1/80 の時間で作成できたことになります。
次にタイルファイル(MBTilesファイル)のサイズを比較します。
ツール | ファイルサイズ |
---|---|
OpenMapTiles | 1.64 GB (1,770,934,272 バイト) |
Flatmap | 1.66 GB (1,784,504,320 バイト) |
Flatmap のほうが少し大きいですが、概ね同サイズでした。
次に実際に地図として表示したときの差異を見てみます。
Flatmap の GitHub のページでは、tileserver-gl-light を使って確認する方法が紹介されていますが、地物のラベル等が表示されないようなので、私のほうで作成した Tileserve-gl を Docker Compose で起動するものを使って比較したいと思います。
ズームレベル0
最も引いた状態で表示してみました。
Flatmap
OpenMapTiles
OpenMapTiles には国境が表示されていますが、それ以外は同じです。
日本
日本全体を表示してみました。
Flatmap
OpenMapTiles
OpenMapTiles は日本以外の国の行政界が表示されていますが、日本国内においては同じように見えます。
東京23区
東京23区です。
Flatmap
OpenMapTiles
東京駅周辺
東京駅周辺です。
Flatmap
OpenMapTiles
東京駅周辺を3D表示してみました。
Flatmap
OpenMapTiles
東京23区、東京駅周辺、3D表示等、ほぼ変わりなさそうです。
まとめ
Flatmap の作成の早さに不安がありましたが、日本国内においては OpenMapTiles とほぼ同じものが生成されていると考えてよさそうです。
Flatmap を使えば気軽にタイルの更新ができていいですね。
Flatmap はこの記事を書いている段階ではかなりバージョンが若い(2021年11月時点でv0.1.0)です。今でも十分使えるレベルだと感じましたが、今後の改善、発展に期待したいと思います。
Discussion