0
Help us understand the problem. What are the problem?

posted at

Organization

tilemakerを使って爆速でOSMベクタータイルを作る

この記事は2021 Advent Calendar ベクトルタイル13日目の記事です。

TL;DR

  • tilemakerだと日本のOSMベクタータイルを作るのに2時間かからない
  • (まだExperimentですが)planetでも37時間で出来るというベンチマーク

tilemaker

C++で書かれた、osm.pbf->.MBTiles変換ツール。OpenMapTilesに準拠したスキーマでタイルを生成する。

OpenMapTilesとの違いは速度。OpenMapTilesのタイル生成はかなり時間がかかる(日本だけで50時間、planetのベンチマークは見つからなかったが、想像したくないくらいの時間がかかりそう)。後述するが、tilemakerでは日本の領域のタイル生成に2時間かからない

仕組みの違いとしては、OpenMapTilesがOSMデータを全てPostgreSQLに投入してから色々処理しているのに対して、tilemakerは全てオンメモリで処理を行う(GitHubのdescriptionによればwithout stackと表現されている)。

ゆえにtilemakerでは、実行マシンのメモリ容量はそれなりに大きいものが必要(planet対応のIssueで、最大メモリ使用量が131GBであったと記載されている ※planet-latest.osm.pbfのファイルサイズは90GB程度)。メモリが大きいとパフォーマンスがよいとかそういう話ではなくて、足りないと処理が落ちる。

また、tilemakerには差分更新の仕組みはない(でもその必要がないくらい処理が早い)。

OSMタイルの日本分を作ってみる

実行条件

  • japan-latest.osm.pbf(1.6GB)
  • AWS EC2 r5.large(16GB RAM)

手順

git clone https://github.com/systemed/tilemaker.git
cd tilemaker

# osm.pbfをダウンロード(1.6GB)
wget https://download.geofabrik.de/asia/japan-latest.osm.pbf

# tilemaker実行
docker build . -t tilemaker
mdkir output
docker run -v $PWD:/output tilemaker --input japan-latest.osm.pbf --output output/japan.mbtiles

2時間足らずでMBTilesの生成が完了。

出来栄えを確認

© OpenMapTiles © OpenStreetMap contributors

スクリーンショット 2021-11-27 20.54.30.png
スクリーンショット 2021-11-27 20.54.45.png
スクリーンショット 2021-11-27 20.55.34.png
スクリーンショット 2021-11-27 20.56.14.png
スクリーンショット 2021-11-27 20.57.04.png

(もうこれで良いんじゃないかな)

細かい検証はしていないが、OpenMapTilesで生成したタイルと同じ見た目になっている(フォントは置いといて)。
参考:https://tile.openstreetmap.jp/styles/osm-bright/#13.79/35.68197/139.7648

その他

  • NaturalEarthのデータなどを配置しておくと取り込む機能もある模様(未検証)。

終わりに

tilemakerはOSMベクタータイルのゲームチェンジャーだと思います。OSMタイル生成が圧倒的に手軽になります。運用を考えると、タイル生成のコストが大きいとデータの更新が悩みのタネですが、tilemakerが実用レベルに到達すれば、この問題が解消されます。誰でもOSMベクタータイルを作成・配信・運用できるようになると思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?