tippecanoe をインストールするとついてくるコマンド tile-join について、これまで属性の JOIN をする目的のものと感じ違いしていたのですが、次のような地道な使い方ができるように思います。あとで検証します。
tile-join に対する誤解の解消
tippecanoe の README.md で、tile-join は次のように説明されています。
Tile-join is a tool for copying and merging vector mbtiles files and for joining new attributes from a CSV file to existing features in them.
この and を「かつ」という意味に私は読んでしまい、これまでは CSV テーブルとの JOIN を行うことが主眼のツールであると勘違いしていました。実際には、そういった意味での JOIN 作業を行わない場合にも、このツールは当然使えますし、README.md をみる限りも、ベクトルタイルパッケージ(mbtiles)周りの地道な作業に使えるようです。
本稿では以下、具体的な地味な使い方6つを紹介します。
(1) ベクトルタイルパッケージをマージする
次のコマンドで、a.mbtiles と b.mbtiles に含まれるタイルが全てコンバインされるそうです。同じタイルに同じレイヤがあったとしても、しっかりとマージしてくれるように書かれています。
$ tile-join -f -o out.mbtiles a.mbtiles b.mbtiles
-f は、out.mbtiles がすでに存在している場合に上書きするためのオプションです。
(2) ベクトルタイルをファイルシステム展開する
a.mbtiles にパッケージされているベクトルタイルを tiles というディレクトリに展開します。
$ tile-join -e tiles a.mbtiles --no-tile-compression
これまで、私は fan-out というシリーズの Node.js スクリプトを作っていましたが、これは不要かもしれない、ということになります。
2018-09-27: --no-tile-compression オプションを付加するべきことを追記。
実際にやってみた感想
ファイルシステム展開については、実際にやってみました。指定したフォルダの直下に {z} のフォルダが作成され、中に {z}/{x}/{y}.pbf の名前でファイルが展開されます。
なお、展開の速度は tippecanoe と大体同じくらいです。速いファイルシステムならば早く、遅いファイルシステムならばそれなりに書き出される、ということだと思います。
vector-tile-spec ではベクトルタイルの拡張子に .mvt を使うべき (SHOULD) とされているのに、vector-tile-spec v2 を採用した段階で Mapbox さんのプロダクトですら拡張子が .mvt になったことはよく知られており、現在、ベクトルタイルに拡張子 .mvt をつけて提供している著名なサービスはないようです。
このツールの挙動も、ベクトルタイルの拡張子は .pbf とするという見解を補強してくれるようです。
(3) レイヤの抽出
ベクトルタイルパッケージ a.mbtiles の中から特定のレイヤ buildings を抽出して新しいベクトルタイルパッケージ out.mbtiles を作るには、次のようにすると良さそうです。
$ tile-join --layer=buildings -f -o out.mbtiles a.mbtiles
$ tile-join -l buildings -f -o out.mbtiles a.mbtiles
(4) ズームレベルの削り込み
ベクトルタイルパッケージ a.mbtiles のズームレベル 4 から 6 だけを取り出した out.mbtiles を作るには、次のようにすると良さそうです。
$ tile-join -z 6 -Z 4 -f -o out.mbtiles a.mbtiles
$ tile-join --maximum-zoom=6 --minimum-zoom=4 -f -o out.mbtiles a.mbtiles
(5) 余計な属性の削除
余計な属性 fid をベクトルタイルパッケージ a.mbtiles から削除したベクトルタイルパッケージ out.mbtiles を作るには、次のようにすると良さそうです。
# tile-join -x fid -f -o out.mbtiles a.mbtiles
(6) 地物単位でのフィルタリング
Mapbox GL Style Specification の filter expression を使って、a.mbtiles からマッチした地物だけを抽出した out.mbtiles を作るには、次のようにすると良さそうです。
$ tile-join -j 'filter' -f -o out.mbtiles a.mbtiles
filter expression については、もう少し研究してあとで書きたすようにします。
ただし、filter expression は deprecated になっている ので、この機能が長期的に安定していることを期待することは避けたほうが良さそうです。
※500KB 以上になるベクトルタイルはコピーされない
デフォルトでは、500KB 以上になるベクトルタイルはコピーされないそうです。 --no-tile-size-limit でこの挙動はキャンセルされるとのこと。