TL;DR
- 以下のコマンドでogr2ogrでも任意形式のファイルからz/x/y.pbf形式のベクタータイルを生成出来る
ogr2ogr -f "MVT" target_dir source.gpkg -dsco MINZOOM=7 -dsco MAXZOOM=16 -dsco COMPRESS=NO
- 以下のコマンドでz/x/y.pbf形式のベクタータイルを任意形式にデコード出来る(以下はtarget_dir内のズームレベル16のタイルを対象とする例)
ogr2ogr -f "GPKG" decoded.gpkg ./target_dir/16
はじめに
ベクタータイルをつくるなら普通ならtippecanoeを使うと思いますが、QGISでもベクタータイルが出力出来るくらいだし多分GDALで対応してるんだろうなと思って調べたらやっぱり対応していたので、試してみました
ogr2ogrで変換
GDALでベクターを扱うためのコマンドはogr2ogrですね、いつものように変換してみます。
ogr2ogr -f "MVT" target_dir source.shp -dsco MINZOOM=7 -dsco MAXZOOM=14
するとtarget_dirフォルダが生成され、中にはz/x/y.pbf形式でファイルが出力されていきます。
ひとつ試しにQGISに突っ込んでみたら、ちゃんと読み込めたので変換は成功したと思いきや、していませんでした。ローカルでサーバーを立ててからQGISやMapbox GL JSで読もうとしても、表示されません。
gzipに変換されてしまう件
MVTへの変換時、明示しないとgzipで圧縮されてしまうようです。これにより適切に表示出来ていなかったよう。ちゃんと配信するにはサーバーの設定が必要らしいですがよくわからないしめんどうなので、そもそも圧縮を無効化します(ちなみに圧縮率は非圧縮比8割強でした)。
ogr2ogr -f "MVT" target_dir source.shp -dsco MINZOOM=7 -dsco MAXZOOM=14 -dsco COMPRESS=NO
これで変換したらQGISやブラウザでも表示されました。
複数レイヤー対応
ベクタータイルは複数のレイヤーをひとまとめにして、必要なレイヤーだけ表示したり個別にスタイリング出来ます。しかし、ogr2ogrはひとつの入力ファイルをひとつの形式で出力します。すなわち、複数ファイルを同時に変換する事は出来ないので、複数のレイヤーをベクタータイルに格納するには、事前に複数のレイヤーをひとつのファイルにまとめておく必要があります(GeoPackage推奨)。
ogr2ogr -f "GPKG" -update -append sources.gpkg source1.shp
ogr2ogr -f "GPKG" -update -append sources.gpkg source2.shp
そして改めて
ogr2ogr -f "MVT" target_dir sources.gpkg -dsco MINZOOM=7 -dsco MAXZOOM=14 -dsco COMPRESS=NO
で複数レイヤーからなるベクタータイルが生成されます。
このケースだと、source-layerは"source1", "source2"になります。
ベクタータイルからの変換
z/x/y.pbf形式のベクタータイルを任意形式に変換出来ます。その場合、"z"のディレクトリをogr2ogrの引数とします、以下例。
ogr2ogr -f "GPKG" decoded.gpkg ./target_dir/16