はじめに
この記事は、ウェブ地図の関係のうち、ベクトルタイル作成に関するメモです。
UN Vector Tile Toolkit は、ベクトルタイルに関する作業のいろいろなステップをサポートしています。今日はデータ変換、Produceについて書いてみます。
最近、わたしもいくつかのパターンでのデータ変換をやったり見たりする機会があったので、自分なりに感じたUNVTにおける ベクトルタイル作成のポイントを書いてみたいと思います。UNVTに学ぶ、Tippecanoeでのデータ変換のコツ、といったところです。(Tippecanoeはmapboxさんが開発したツールです。)
ポイント
1. ソースデータを GeoJSON sequenceとして読んでくる
まずはソースデータを読んでくる段階です。いずれもコマンドラインで操作できるツールを使ってGeoJSON sequenceとして読み出すことが第一歩です。
- PostgreSQL/PostGIS は nodejs の pg モジュールで GeoJSON sequence を読み出す ことができる。データサイズが小さければgdal(ogr2ogr)でも大丈夫。
- Esri shapefile、Esri Geodatabase、などは、ogr2ogr を使えば、 GeoJSON sequence を読み出す ことができる。
- OpenStreetMapのデータ(osm.pbf)は osmiumのexport で出力できる。
ソースデータが大きい場合、この読み出しの段階で範囲を区切って複数の処理にしたりします。この場合は、ベクトルタイルの区画などを使うと効率的です(後で重複を考えなくてよいから)。
2. 出力したGeoJSON sequence を加工する(効率的なベクトルタイル構造のため)
だいたいnodejsでフィルターをしていますが、ソースデータから出てきたGeoJSON sequenceを整形します。nodejs の json-text-sequenceモジュールなどを使うケースが多いです。
このフィルターが効果的なベクトルタイル作成のための重要な部分です。フィルターを作る前にソースデータとベクトルデータの構造をよく考えることが大事です。
- Tippecanoe用の属性を与える
- ベクトルタイルのレイヤ名
- 最大ズームと最小ズーム
- 元データの属性に応じたデータの加工、取捨選択
- 元データの属性によって、レイヤ名を変えたり、最大・最小ズームを変えたり、場合によってはnullを返したする。
- 不必要な属性を削除する。必要な属性を追加する。
など
3. データの受け渡しを工夫する
出力 → フィルター → 変換 と段階が進みますが、この時にファイルとして保存すると時間がかかってしまいます。
ですので、読んだデータの受け渡しは、シェルスクリプトのパイプ(|)を使うことが多いですが、元データのサイズが大きくなるとnodejsの非同期処理spawnを使うこともあります。(ソースデータがもっと大きくなるとqueueなどを工夫して、小さくしたブロックをパラレルに処理していくというようなこともできます。)
4. 最後は Tippecanoe で変換
整形された GeoJSON Sequence を Tippecanoe に渡すことでベクトルタイルができます。Tippecanoe は Windows では動きにくいので、windowsのユーザーはDockerで疑似Linux環境を作ったり、ラズベリーパイで変換する。
- mbtiles形式に出力して、必要な場合はtile-joinでpbfファイルにするのが効率的。(mbtiles形式の方が一般的にサイズが小さい)
- pbfに出力する場合は圧縮しない。また、--no-size-limit をつけておくとよい。
まとめ
ということで、今回はUNVTの手法に学び、Tippecanoeを使ったベクトルタイル変換のコツをまとめてみました。(ほかにもコツがあるかもしれません。)
ここでの知見はUN Open GIS Initiativeに参加して得たものを含みます。
参考
- 参考になる記事やレポジトリ
- IT dashboard の行政界データをベクトルタイルにした(hfu, 2019) https://qiita.com/hfu/items/35e6dc67d55f3bcec181
- unvt/naru https://github.com/unvt/naru
- data conversion from esri Geodatabase https://qiita.com/T-ubu/items/2dedbf45df9dcaeead33
- ツール関係
- Tippecanoe https://github.com/mapbox/tippecanoe
- npm pg https://www.npmjs.com/package/pg
- gdal https://gdal.org/