1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenStreetMapから、UNVTを使ってベクトルタイルを作る(dockerベースのunvt/nanban)

Posted at

はじめに

以下の記事を日本語でもメモしておきます。

FOSS4Gなどに参加しても、ベクトルタイル技術の利用は年々増えてきているように思います。ベクトルタイルを作成するツールはたくさんあります。たとえば、OpenMapTilestilemakeronthegomap/planetiler などを使えば、OSMからベクトルタイルを作ることができます。

国連ベクトルタイルツールキット UN Vector Tile Toolkit (UNVT)でも、OSMからベクトルタイルを作成する方法を開発しています。ここではUNVTを使ってどのようにベクトルタイルを作るか紹介したいと思います (特に unvt/naru unvt/nanban).

unvt/naru は数年前に開発されまして、nodejs ver.12で動いていました。このDocker環境を構築しようとすると、少なくとも私の環境ではできなかったので、今回の作業のために新しいレポジトリubukawa/mini-naruをつくり、unvt/naruの中からデータ変換に必要なものを抜き出しました。これらをunvt/nanbanの上で処理することで作業を進めたいと思います。

私の環境

  • Windows 10 (Enterprise)
  • Docker version 20.10.8
  • PowerShell version 5.1.19041.1237
  • git version 2.25.0.windows.1

手順

Step 1: ファイルのダウンロード

"GEOFABRIK"などのOSMデータをダウンロードできるサイトからosm.pbfファイルをダウンロードします。今回は米国のオハイオ州のOSMデータをダウンロードすることにしました。"ohio-latest.osm.pbf"が保存されます。
image.png

Step 2: mini-naru のクローン

必要なファイルを得るために、レポジトリをクローンしておきます。

git clone https://github.com/ubukawa/mini-naru
cd mini-naru

Step 3: Dockerコンテナの起動

作業場所に移動したら、保存したOSMデータをsrcディレクトリに保存します。そしてunvt/nanban をスタートします。unvt/nanban は、今回行うベクトルタイル処理に必要なツールがほとんど入っているdockerイメージです。unvt/nanban のを使ったことがない場合はdocker pull unvt/nanbanしてからコンテナを起動します。作業フォルダを/dataに関連付けておきます。

docker run -it --rm -v ${PWD}:/data unvt/nanban
cd /data

Step 4: コンフィグファイルを参照しながらデータのエクスポートを試してみる

データ(src/ohio-latest.osm.pbf)を読み込むにはosmisumというツールを使います。このツールを使った読み込みのためのコンフィグファイルosmium-export-config.jsonはすでにレポジトリにありますが、これを参照させて、以下のようにコマンドを実行してみます。

 osmium export --config osmium-export-config.json --index-type=sparse_file_array --output-format=geojsonseq --output=- src/ohio-latest.osm.pbf

image.png
地物がGeoJSON sequenceの形で出力されているのがわかります。ここまでは成功です。

image.png
osmium-export-config.jsonについて、中身を丸々紹介しませんが、どういう設定で出力させているのかを確認する際にはこちらを確認するとよいです。

Step 5: フィルターを使ってGeoJSONを加工

前のステップで出力された GeoJSON sequence にたいし、 filter.jsmodify.js でベクトルタイル関係の情報を追加したりします。nodejsを使うので最初に以下の2つのnpmパッケージをインストールしておきます。

npm install --save json-text-sequence @mapbox/geojson-area

filter.jsmodify.js は、もうレポジトリに入っています。ここにコピペしませんが、このmodify.jsがこれまでの努力の結晶というか、OSMから変換されるベクトルタイルの構造を決めるものなので大変重要です。よくできる方は、このmodify.jsを加工することで自分好みのベクトルタイルにできます。

コマンド自体は、前までのコマンドにパイプをくっつけて、nodejsにつなげるという感じのものです。

osmium export --config osmium-export-config.json --index-type=sparse_file_array --output-format=geojsonseq --output=- src/ohio-latest.osm.pbf | node filter.js

これで出力成果が見られます。前のステップのものと比べると、ベクトルタイル変換用の情報、tippecanoeがついているのがわかります。これで変換の準備ができています。
image.png

Step 6: ベクトルタイル変換(まずはmbtiles形式)

前のステップまでの成果をパイプを使ってtippicanoeに流し込みます。

osmium export --config osmium-export-config.json --index-type=sparse_file_array --output-format=geojsonseq --output=- src/ohio-latest.osm.pbf | node filter.js | tippecanoe --no-feature-limit --no-tile-size-limit --force --simplification=2 --maximum-zoom=15 --base-zoom=15 --hilbert --output=src/output.mbtiles

image.png
少し時間がかかるかもしれません。作業マシンの性能や、ソースデータのサイズによると思います。

Step 7: mbtiles形式からpbf形式への変換

GitHubページ等での静的なホスティングにも対応するため、mbtiles形式のベクトルタイルをpbfに変換します。tippecanoe の中にあるtile-joinを使います。しかし、pbfタイルにするとデータサイズが3~4倍程度になることもあるので、もともとのmbtilesのサイズによってpbfにするかどうかを考えた方がよいです。mbtilesでホストする場合には、/onyx(https://github.com/un-vector-tile-toolkit/onyx )のようなサーバーサイドの処理が必要になると思います。

tile-join --force --no-tile-compression --no-tile-size-limit --output-to-directory=docs/zxy src/output.mbtiles

成果: PBF形式でのベクトルタイル

このようにして、zxyフォルダ構造に格納されたpbfタイルを得ることができました。
image.png

メタデータなどを確認すると中心位置なども確認できます。(デフォルトスタイルの修正の時に使える。)
image.png

追加説明: ベクトルタイル地図のホスティング

地図のスタイル

ここで作成したベクトルタイルのデータ構造はunvt/naru の filter.jsmodify.js によるものですから、unvt/naru で準備されたデフォルトのスタイルを使うことも可能ですこちらにコピー 。ただし、中心、データソース、sprites、glyphsなどは修正しないといけません。

ホスティング

GitHubページに必要なライブラリやファイルを一緒にアップするのがやりやすいかと思います。unvt/naru ではマップシンボルを作るツールもありますし、テキストフォントなども準備されています。今回の作業レポジトリ mini-naru (https://github.com/ubukawa/mini-naru/tree/main/docs) にunvt/naruのファイルと最新の MapLibre GL JSをコピーしておいたので、ウェブマップ環境構築にも使えます。
image.png

謝辞

今回の試行は、これまでに積み上げられた努力と unvt/naru にまとめられた成果に基づいたものです。 @hfu さんと仲間たちの努力に感謝します。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?