Mapbox CLI : Tileset の登録
背景
- Mapbox Studio の Web 画面からのアップロードは機能に制限がある
- 月20件、合計サイズいくつまで、1ファイルあたり 10MB まで
- 多分このへんの制限は、CLI を推奨したいということを意図しているはず
- 名前に自動生成の suffix が付与される
- また、日々のデータ更新のときにコマンドで完結したい
→ なので、実運用では CLI にしましょう、という話
使用料 (Compute Units)
有料なので実行しすぎ注意
- CU (Compute Unit) という単位で課金しているようだ
- 20 CU / 月までは 無料枠
- 20-1,000 CU は 9 ドル (2025/08 時点)
- 目安1: 公園情報の 10,000 ピン(7MB) のアップロードで 1.8 CU
- 目安2: delete せずに upload して膨れ上がったせいか 1回あたり 10 CU ぐらい使用されることも
- ドキュメント的には、ここ? https://docs.mapbox.com/mapbox-tiling-service/guides/
公式ドキュメント
https://docs.mapbox.com/help/tutorials/get-started-mts-and-tilesets-cli/?step=1
↑
ここに書いてあるままで情報足りる
・・・と思ったが、試行錯誤してよく分からないので、下の方のメモがぐちゃぐちゃになってきた。
前提
- ✓ Mapbox CLI のインストール
pip install mapbox-tilesets
- ✓ Token の作成後、環境変数への読み込み
TILES:..
が付与されたもの- 新規で作れば良い
export MAPBOX_ACCESS_TOKEN=sk.XXXXXXXXXXXX
作業1. データソース (GeoJSON のアップロード)
tilesets upload-source sugoi-user parks-data data/parks.min.geojson
→ mapbox://tileset-source/sugoi-user/parks
のように作成される
アップロードするGeoJSON データは 改行やインデントされていないこと
※ 覚え書き
- 生成時に Python の
json.dumps()
を使用している場合はindent=2
などの引数を外せば良い - 生成後に変換するなら
jq -c . parks.geojson > parks.min.geojson
Mapbox Studio に出てくるサイズを見るに、どうやら「追記」で入っている ようなので、
いったん delete
してから upload
すること
tilesets delete-source sugoi-user parks-data
→ このあと 確認用に [ sugoi-user/parks-data ] の手入力を促される。矯正したいなら -f オプションで
tilesets upload-source sugoi-user parks-data data/parks.min.geojson
作業2. Tilesets 登録 (source の紐づけ設定するが、この時点ではカラ)
tilesets create sugoi-user.parks-tileset --recipe data/parks-recipe.json --name "parks"
recipe (json ファイル) の作成例
{
"version": 1,
"layers": {
"parks": {
"source": "mapbox://tileset-source/sugoi-user/parks-data",
"minzoom": 0,
"maxzoom": 5
}
}
}
→ この時点で Mapbox Studio 上はカラの Tileset が表示される
- recipe ファイル内の minzoom, maxzoom は省略不可
- アプリで読み込んだときに、ピンの表示が zoom によって制限されるという話ではない
- タイル(後ろに出る建物情報などの地図データ)の読み込みを制御するためのもの
- max を制限することで、通信量や、地図の煩雑さを避けることができる
- 例1: ヒートマップなどが出したいだけで広い範囲での分布が見たいだけの場合 : 0〜5 (都道府県レベル)
- 例2: ピンの周りの詳細データ見たい場合: 0〜15 (街区レベル)
- 「新規作成」でなく「更新」するときは
create
でなくupdate-recipe
コマンドを使う
tilesets update-recipe sugoi-user.parks-tileset data/parks-recipe.json
作業3. 変更の反映 (Pubilsh)
tilesets publish sugoi-user.parks-tileset
→ この時点で Mapbox Studio 上は Tileset にレイヤが追加された状態で見える
- tileset : parks-tileset
- layer : parks ← これは引数でなく recipe で設定したもの
アプリから指定する場合は
VectorSource(id: "parks").url("mapbox://sugoi-user.parks-tileset")
CircleLayer(id: "parksLayer", source: "parks").sourceLayer("parks")
※ 便宜上 名前を分けたが、別に同じでも良い
以降のワークフロー
Tilesets は1回登録すれば変わらないので、データのみ更新したい場合は 作業2 は飛ばし、
- 作業1. upload-source
- 作業3. publish
だけやれば良い。
→ TODO: upload-source したあとに publish しても古いものを参照したりしていないか?、というようなことの確認できるように、Download 機能もほしいような
→ アプリはともかく、Mapbox Studio への反映にもタイムラグがあるようなので(?) どれを信用して良いのか分からん
- upload-source したものが publish 時に使用されている (前回 upload したものになっていないか?)
- 項目が削られている? (非対応の「配列」は特に何も警告なく削られる)
- Mapbox Studio で publish 完了の表示は出るが ピンには反映されない。タイムラグがあるだけで待ってれば反映される?
- アプリで ピンに反映されない。待ってれば反映される?
- キャッシュクリアはない?
スクリプト例
覚えられないのでスクリプトにする。
しかし、いまは実施したいとこ以外コメントにする等しながら実行してる。かなり意味なし
#!/bin/bash
export MAPBOX_ACCESS_TOKEN=sk.XXXXXXXXXXXX
USER=sugoi-suser
DATASOURCE_PATH=data/parks.min.geojson
RECIPE_FILE=data/parks-recipe.json
DATASOURCE_NAME=parks-data
TILESET_NAME=parks-tileset
tilesets upload-source $USER $DATASOURCE_NAME $DATASOURCE_PATH
# 初回のみ
# tilesets create $USER.$TILESET_NAME --recipe $RECIPE_FILE --name $TILESET_NAME
# 2回目以降?
# tilesets update-recipe $USER.$TILESET_NAME $RECIPE_FILE
sleep 10
tilesets publish $USER.$TILESET_NAME
制約・・
https://docs.mapbox.com/mapbox-tiling-service/recipe-specification/vector/
配列には対応していない
文字列配列を入れた場合の動作
方法 | 動作 |
---|---|
Mapbox Studio | JSON でシリアライズされた文字列が入る |
Mapbox CLI Tileset | 項目自体なかったことになる |