tile.openstreetmap.jp の更新 2022-12-11
概要
https://tile.openstreetmap.jp/
地球惑星規模(planet規模)のタイル地図を配信している
作業の流れ
実家にあるRaspberry Piが踏み台
踏み台から実家内ネットワークにあるIntel PCにsshして、そこでplanet規模のmbtilesを構築する
スペック
ストレージ3.6TBのSSD
実メモリ 16GB
Swapメモリ 500GB
えぐいyuiseki.icon
マシンはkioxia社から借りている
ssh後にtmuxにアタッチする
tmuxに作業の状態が残っているので、すぐ再開できる
https://planet.openstreetmap.org/ に毎週OpenStreetMapのplanet規模での更新情報が来る
このドメインは、IPごとの転送量に、40GBくらいの制限が掛けられている
つまり https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf は、ブラウザやwgetやcurlでダウンロードしようとしても、絶対に最後までダウンロードできない
なんと!!yuiseki.icon
OpenStreetMapとしては、torrentとかAWS S3のミラーを使ってね、ということ
OpenStreetMapのplanet-latest.osm.pbfには、AWS S3のパブリックミラーがある
そちらが更新されていることを確認する
https://planet.openstreetmap.org/ が更新されたからといって、即座にAWS S3のミラーが更新されるわけではないので、要確認
code:bash
aws s3 ls s3://osm-pds
OpenStreetMapのAWS S3ミラーの最新情報ページ
https://registry.opendata.aws/osm/
こっちは古いページらしい
https://docs.opendata.aws/osm-pds/readme.html
ローカルマシンの作業ディレクトリを削除する
planet-latest.osm.pbfからmbtilesを構築するために、planetilerを使っている
ほぼここに書いてあることをそのまま実行している
https://github.com/onthegomap/planetiler/blob/main/PLANET.md
特筆すべき差分
--fetch-wikidataはやめた
こいつのせいでエラーになって途中でコケる
最終的には70GBのmbtilesができる
すさまじいyuiseki.icon
でも地球地図がmicroSDに入ると思ったらすごいな
ダウンロード時のためのオプション
--download-threads=10とかできる
--download-chunk-size-mb=1000とかできる
10スレッド並列で、1GBごとにRangeリクエストしてダウンロードできる
ビルド時のためのオプション
--nodemap-type=array
--nodemap-storage=mmap
これを指定しないとメモリ不足でエラーになってしまう
planet-latest.osm.pbf以外にも、以下のダウンロードが必要
lake_centerlines
natural_earth
osm_lakelines
water_polygons
これらは、海や湖などを描画するために必要なデータ
ダウンロードには一時間も掛からない
30分くらいだったかもしれないyuiseki.icon
mbtilesのビルドに最も時間が掛かる
処理はメモリバウンド
メモリが多ければ多いほど速い
誰か @smellman に 32GB * 2 メモリを提供してあげてください!!yuiseki.icon
ビルドのステップにはまず、osm_pass1とosm_pass2がある
nodes -> ways -> relations
OSMのステップが終わったら、mbtilesへ出力するステップが始まる
この処理はファイルIOが発生しているため時間が掛かる
タイルの品質チェックをする
scpで本番サーバーに転送する
dockerを停止する
ファイルをmvする
dockerを起動する
ダウンロードやビルドの待ち時間で質問yuiseki.icon
tile.openstreetmap.jp
大量のサーバーがある…?yuiseki.icon
サーバーは一台
スペックは?yuiseki.icon
さくらのクラウド
10万円/月の支援
20コア
メモリ64GB
強い……!yuiseki.icon
大量の小さいサーバーで捌くスケールアウトではなく、一台の大きなサーバーで捌いている、スケールインの構成yuiseki.icon
ベクトルタイルは、nginx+varnishで静的配信
mbtilesをラスタータイルに変換するプロセスがいる
maptiler/tileserver-gl
これが10プロセス走っている
リクエストが来たタイミングで、ラスタータイルのレンダリングをしている
maptiler/tileserver-glは、nginxでプロキシして、各タイルをvarnishでcacheしている
varnishはデフォルト設定
おさらい:mbtilesの実体はsqlite
zxyのインデックス構造になっている
y軸が逆順になっているぞ!
mbtilesは、TMSをもとにしている
Tile Map Service
WMTSというのもある
Web Map Tile Service
最近、PMTilesを追加した
https://tile.openstreetmap.jp/static/
pmtilesのために、/staticはnginxでCORSの設定をしている
pmtilesにはHeadリクエストやRangeリクエストがくるから、varnishでのキャッシュは不要
pmtilesは、クライアントサイドで適切にキャッシュコントロールしてくれる世界観yuiseki.icon
最近はここに、標高タイルを増やそうとしている
OpenDEM
OpenDEMはPlanet規模で作れる?yuiseki.icon
作れるはずだがうまく作れなくて困っている
等高線タイルはできたのでリリースしたいと思っている
デプロイは無停止?yuiseki.icon
mbtilesがビルドできたら、ビルドサーバーから配信サーバーに、scpで転送している
転送が終わったら、配信サーバーのdockerプロセスを止めて、ファイルをmvしている
実は毎週一瞬止まっているけど誰も気づかない
配信サーバーとビルドサーバーが別な理由は?yuiseki.icon
配信サーバーでビルドすると、負荷が掛かって遅くなってしまう!
なるほど!yuiseki.icon
tilemakerでも、本質的にOpenMapTiles schemeでplanet規模のmbtilesが作れれば同じはず…?yuiseki.icon
同じはずだけど、tilemakerはplanet規模では試したことがない
最近期待していること
planetilerが依存している、planetiler-openmaptilesに対して、
OpenMapTiles 3.14のPull requestが来ている
OpenMapTilesのスキーマが変わる
3.14で、OpenStreetMapに近づけようとしている
https://github.com/openmaptiles/openmaptiles/tree/master/style
OpenStreetMap本家により近いStyleの地図をつくれるようになるかもしれない
ところで、OpenMapTilesのMakefileはすごい
わかる。Makefile内でDockerを呼ぶのはいいとして、複数のDockerイメージを別のリポジトリで管理しているのと、sql schemeを動的に生成してDBを構築しているのがビビったyuiseki.icon
https://github.com/openmaptiles/openmaptiles-tools