GeoJSONをバイナリ化して圧縮するFlatGeobuf
FlatGeobufは良い、捗るぞ。
GeoJSON
この数年でかなり普及の進んだGeoJSONですが、データ量が増えるとどうしても重くなりファイルサイズも肥大化するため扱いにくくなっていきます。
そこでGeoJSONの良さ(可搬性)を残しつつ、シリアライズ(バイナリ化)することで巨大なデータも扱いやすくしようという試みが行われてきました。
Geobuf
ファイルサイズが大きくなりがちなGeoJSONをprotocol buffersを使ってシリアライズすることで圧縮したファイルフォーマットです。GeoJSONに比べて8~6分の1ぐらいファイルサイズを抑えることができます。
GeoJSONをGeobufに変換するツールや、ブラウザ上で読み込んだGeobufファイルをGeoJSONに戻す(デシリアライズ)ためのJavaScriptライブラリなどが提供されています。
ただ残念なことに、あまり普及が進んでいません。
「GeoJSONとシームレスに連携するシンプルでモダンなShapefileの後継を設計する」という目標を掲げてはいたのですが、現時点ではGeobufに対応しているGISツールやソフトはあまりなく、データを編集するには毎回GeoJSONに戻してQGISなどのソフトに読み込み、データを編集後、再度geobufに変換するという作業が必要となります。
FlatGeobuf
いまいち普及の進まなかったGeobufに変わって、ここ最近注目度が上がっているファイルフォーマットがFlatGeobufです。
Geobufとの違いは、シリアライズのアルゴリズムにflatbuffersを用いることで、圧縮率やシリアライズ/デシリアライズのパフォーマンスが向上しています。
さらに、現時点ですでにGDALやQGISなどポピュラーなGISツールやソフトがFlatGeobufに対応しています。
Supported applications / libraries
したがって、FlatGeobufファイル(.fgb)はQGISに直接インポートして編集しエクスポートすることができます。
※ 一部、編集が行えないケースがあるようです。
参照:Cannot edit FlatGeobuf backed layer
[追記] QGIS 3.20.3では編集が可能になっています。
いちいちGeojsonに戻して編集する必要がないので手軽に扱うことができます。
Webでの取り扱いが楽(ストリームにも対応)
公式から提供されている flatgeobuf-geojson.min.js を用いると、簡単にflatGeoBufをブラウザで読み込んでGeoJSONにデシリアライズして使うことができます。
また、標準でストリームに対応しているので巨大なデータも非常に扱いやすくなっています。
データ読み込みのサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//メタデータのハンドリング function handleHeaderMeta(headerMeta) { console.log("metadata", headerMeta) } // flatGeoBufデータのハンドリング function handleResponse(response) { //flatGeobufをgeojson(ストリーム)にデシリアライズ let it = flatgeobuf.deserialize(response.body, undefined, handleHeaderMeta) function handleResult(result) { if (!result.done) { console.log(result.value); //featuresが順次、読み込まれる it.next().then(handleResult) } } it.next().then(handleResult) } // fetch APIを使ってflatGeobufを読み込む fetch('example.fgb') .then(handleResponse) |
「Fetch APIのStream機能を使ってデータを読み込みながら地図を描画する」の記事で書いたようなデータの逐次読み込みが簡単に記述できます。
GeoJSON->FlatGeobuf ファイルサイズ比較
最後に、国土数値情報から最新の「全国行政区境界データ」をダウンロードしQGISを使ってFlatGeobufに変換していみました。
GeoJSON | 1.17GB |
FlatGeobuf | 244MB |
かなり圧縮されているのがわかるかと思います。
また、GISソフトでのデータ読み込みにかかる時間もFlatGeobufにすることで改善されるので、ぜひ使ってみてください。