一覧に戻る

バイナリベクタータイルをGeoJSONにデコードする2つの方法

#Python#Node.js#GIS#foss4g#ベクタータイル

Abstract

バイナリベクタータイルの実体は、XYZタイルの位置ごとにサーバーに設置されたPBFファイル群です。PBFファイルはプロトコルバッファと呼ばれる規格で(その詳細は把握していませんが)、GeoJSONをシリアライズしたバイナリデータです。つまり元はGeoJSONなので復元(デコード)可能という事です。今回は2つの手法でGeoJSONへのデコードを試みたいと思います。

tippecanoe-decode

mapbox社謹製のtippecanoeと言えばバイナリベクタータイルの生成で用いられる有名なライブラリですが、付随して、バイナリベクタータイルからGeoJSONへのデコード機能を持っています。

Install

brew install tippecanoe

Usage

tippecanoe-decode <target_pbf> <zoomlevel> <x> <y>

これが基本形で、特定のsource-layerのみを抽出する事も出来ます。

tippecanoe-decode sample.pbf 13 7121 3260 --layer=road

番外編

ベクタータイルをディレクトリで用意出来ている場合、ディレクトリを指定するだけでデコード可能です(この場合、minzoomとmaxzoomを指定してあげた方が安心な挙動をしそう)。しかし出力が少し使いにくいので参考まで(多分PBFファイルを個別に指定するよりこちらの方が速い)。

tippecanoe-decode bvtiles_dir -z 13 -Z 13 --layer=building

Node.js(vector-tile-js)

こちらもmapbox社製のnpmパッケージです。

Install

npm install @mapbox/vector-tile
npm install pbf
npm install fs

Usage

サンプルコードを示します。

var Pbf = require('pbf')
var VectorTile = require('@mapbox/vector-tile')
var fs = require('fs')

let pbfdata = fs.readFileSync(PBFFILE_PATH)
let pbf = new Pbf(pbfdata)
const layer = new VectorTile.VectorTile(pbf).layers[SOURCE_LAYER_NAME];
if (layer) {
    for (let i = 0; i < layer.length; i++) {
        const feature = layer.feature(i).toGeoJSON(X, Y, ZOOM_LEVEL);
        console.log(feature) //GeoJSON形式のFeature
    }
}

References