🐥

Flatmap(Planetiler)で超高速に地図ベクタータイルを生成してみる

2021/12/01に公開

※ 2022/1/19 追記

ここで紹介している Flatmap は Planetiler という名前に変わったようです。
使い方は変わっていないようなので、以下はそのまま使えると思います。

https://github.com/onthegomap/planetiler


先日、ローカル環境で地図を表示するOGP画像を生成するための方法を以下に投稿しました。
https://zenn.dev/uedayou/articles/ac23343b9ec21f

地図は OpenStreetMap を使い、その地図タイルをローカル環境で表示するためにOpenMapTilesでOSMデータをタイル化して使用しました。

https://github.com/openmaptiles/openmaptiles

問題点

先の投稿の方法でやりたかったこと(大量の地図画像ファイルをローカル環境で生成)は達成できました。しかし、OpenMapTiles を使った地図タイル生成のかなりの時間がかかることが懸念点として挙げられると思います。

私が日本国内のタイルをOpenMapTilesを使って生成したときは、完了まで48時間ほどかかりました。一度作成しておけば地図データを更新しない限りはやらなくていいとはいえ、丸2日動かし続けないといけないのはいろいろと辛いです。

OpenMapTiles と同じく OSM からベクタータイルを生成するツールとして Flatmap というのを見つけました。説明を読むと、生成する速さがウリ、なようなので試してみました。

https://github.com/onthegomap/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 で起動するものを使って比較したいと思います。

https://github.com/uedayou/tileserver-gl-docker-compose

ズームレベル0

最も引いた状態で表示してみました。

Flatmap
Flatmap

OpenMapTiles
OpenMapTiles

OpenMapTiles には国境が表示されていますが、それ以外は同じです。

日本

日本全体を表示してみました。

Flatmap
Flatmap

OpenMapTiles
OpenMapTiles

OpenMapTiles は日本以外の国の行政界が表示されていますが、日本国内においては同じように見えます。

東京23区

東京23区です。

Flatmap
Flatmap

OpenMapTiles
OpenMapTiles

東京駅周辺

東京駅周辺です。

Flatmap
Flatmap

OpenMapTiles
OpenMapTiles

東京駅周辺を3D表示してみました。

Flatmap
Flatmap

OpenMapTiles
OpenMapTiles

東京23区、東京駅周辺、3D表示等、ほぼ変わりなさそうです。

まとめ

Flatmap の作成の早さに不安がありましたが、日本国内においては OpenMapTiles とほぼ同じものが生成されていると考えてよさそうです。
Flatmap を使えば気軽にタイルの更新ができていいですね。

Flatmap はこの記事を書いている段階ではかなりバージョンが若い(2021年11月時点でv0.1.0)です。今でも十分使えるレベルだと感じましたが、今後の改善、発展に期待したいと思います。

Discussion