Skip to main content

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 のインストール
bash
pip install mapbox-tilesets
  • ✓ Token の作成後、環境変数への読み込み
    • TILES:.. が付与されたもの
    • 新規で作れば良い
bash
export MAPBOX_ACCESS_TOKEN=sk.XXXXXXXXXXXX

作業1. データソース (GeoJSON のアップロード)

bash
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 すること

bash
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 の紐づけ設定するが、この時点ではカラ)

bash
tilesets create sugoi-user.parks-tileset --recipe data/parks-recipe.json --name "parks"

recipe (json ファイル) の作成例

json
{
"version": 1,
"layers": {
"parks": {
"source": "mapbox://tileset-source/sugoi-user/parks-data",
"minzoom": 0,
"maxzoom": 5
}
}
}

→ この時点で Mapbox Studio 上はカラの Tileset が表示される

minzoom, maxzoom について
  • recipe ファイル内の minzoom, maxzoom は省略不可
  • アプリで読み込んだときに、ピンの表示が zoom によって制限されるという話ではない
  • タイル(後ろに出る建物情報などの地図データ)の読み込みを制御するためのもの
  • max を制限することで、通信量や、地図の煩雑さを避けることができる
  • 例1: ヒートマップなどが出したいだけで広い範囲での分布が見たいだけの場合 : 0〜5 (都道府県レベル)
  • 例2: ピンの周りの詳細データ見たい場合: 0〜15 (街区レベル)
更新するとき
  • 「新規作成」でなく「更新」するときは create でなく update-recipe コマンドを使う
bash
tilesets update-recipe sugoi-user.parks-tileset data/parks-recipe.json

作業3. 変更の反映 (Pubilsh)

bash
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 完了の表示は出るが ピンには反映されない。タイムラグがあるだけで待ってれば反映される?
  • アプリで ピンに反映されない。待ってれば反映される?
  • キャッシュクリアはない?
スクリプト例

覚えられないのでスクリプトにする。
しかし、いまは実施したいとこ以外コメントにする等しながら実行してる。かなり意味なし

bash
#!/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 StudioJSON でシリアライズされた文字列が入る
Mapbox CLI Tileset項目自体なかったことになる