はじめに
MapLibre Styleとベクタータイルを用いた地図配信はずいぶんとコモディティ化してきたと思います。拙著『位置情報エンジニア養成講座』でも、この分野は重点的に扱っています。
また、ラスタータイルの作成は、GeoTIFFなどのラスターデータを元にした手順は十分に知れ渡っています。
一方で、ベクタータイルとMapLibre Styleはあるけど、これをラスタータイル化したい、という時にそれっぽい手順が示されていないように思います。なので本記事でこの手順について述べます。
使う道具
- MapLibre Style
- 有効なstyle.jsonがあるとします(リモートでもローカルでもOK)
- Docker Desktop
- chiitilerサーバーを動かします
- chiitilerは、MapLibre Styleをラスタータイルとして配信するためのサーバーです
- Python
- tilegetを動かします
- tilegetは、地図タイルのダウンロードユーティリティです
chiitilerもtilegetも筆者が趣味で開発・公開しているライブラリです。
なお以降の手順はmacOS/bashで実行しています。適宜読み替えてください。
概観
手順
style.jsonを用意
こちらのBrightスタイルを利用させてもらいます。tiles
というディレクトリにstyle.json
として保存しておきます(これはローカルのstyle.jsonを利用できること示すためであり必須の手順ではありません)。
chiitilerサーバーを起動
cd tiles # tiles/styles/style.json があるとします
docker run -p 3000:3000 -d \
-e CHIITILER_DEBUG=true \
-e CHIITILER_CACHE_METHOD=file \
-e CHIITILER_FILECACHE_DIR=/workdir/cache \
-v $PWD:/workdir \
ghcr.io/kanahiro/chiitiler
cacheフォルダにMapLibre Styleで利用されるデータがキャッシュとして保存されることに留意してください。この挙動は環境変数により変更可能です: https://github.com/Kanahiro/chiitiler?tab=readme-ov-file#usage
ただし、リモートのデータを利用する場合はファイルキャッシュを利用することをお勧めします(さもなくば、毎回style.jsonなどを読み直すことになり遅く、サーバーに余計な負荷がかかる)。
http://localhost:3000/debug を開いて地図画面が表示されれれば起動出来ています。
chiitilerは以下のようなURLでタイルを配信してくれます
# ローカルにあるstyle.jsonを用いる場合はfile://プロトコル
http://localhost:3000/tiles/{z}/{x}/{y}.webp?url=file:///workdir/styles/style.json&quality=100&margin=0&tileSize=512
# https://プロトコルで、リモートデータも利用できる
http://localhost:3000/tiles/{z}/{x}/{y}.webp?url=https://tile.openstreetmap.jp/styles/osm-bright/style.json&quality=100&margin=0&tileSize=512
クエリパラメータで画像フォーマットや品質などを制御できます。詳しくはドキュメントを参照してください。 https://github.com/Kanahiro/chiitiler?tab=readme-ov-file#tiles
tilegetでタイルリクエスト
pip install tileget
which tileget # インストールできればパスが通る
tileget "http://localhost:3000/tiles/{z}/{x}/{y}.webp?url=file:///workdir/styles/style.json&quality=100&margin=0&tileSize=512" -o tiles.mbtiles --extent 141.23 40.56 142.45 43.78 --maxzoom 12
# downloading: http://localhost:3000/tiles/0/0/0.webp?url=file:///workdir/styles/style.json&quality=100&margin=0&tileSize=512
# downloading: http://localhost:3000/tiles/1/1/0.webp?url=file:///workdir/styles/style.json&quality=100&margin=0&tileSize=512
# downloading: http://localhost:3000/tiles/2/3/1.webp?url=file:///workdir/styles/style.json&quality=100&margin=0&tileSize=512
# ...
読むとなんとなくわかると思いますが、URL・保存先・領域などを指定して実行します。デフォルト値はインターバルを長めに取っていたりするので、適宜ドキュメントを参照してください https://github.com/Kanahiro/tileget?tab=readme-ov-file#usage
リモートサーバーにリクエストする場合は、過負荷とならないよう、インターバルの取り方に気をつけましょう。
この手順でtiles.mbtiles
が出来上がります。QGISで確認してみます。
© OpenMapTiles © OpenStreetMap contributors タイルが保存されていることがわかる
後片付け
Dockerコンテナが走りっぱなしになってしまうので、止めておきましょう。
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 488f75ef1c85 ghcr.io/kanahiro/chiitiler "./docker-entrypoint…" 8 minutes ago Up 8 minutes ...
docker stop 488