バイナリベクトルタイル

バイナリベクトルタイルの作り方

全国のガソリンスタンドの位置を地図上にプロットしてみた。」で作成したバイナリベクトルタイルの作業工程メモです。

バイナリベクトルタイルとは

巨大なGeoJSONを分割しタイル化することで必要な情報だけを読みだして地図上に表示します。さらに分割したGeoJSONをバイナリファイルにすることでオーバーヘッドを減らしています。

バイナリベクトルタイル出会うまでの私

1.GeoJSON爆誕
「フロントエンドエンジニアでも簡単に地理情報を扱えるJSON形式の規格考えたよ!」
「素晴らしい!」

2.TopoJSON誕生
「GeoJSON重くない? もっと効率のいい規格作った!」
「最高!」

3.ベクトルタイル到来
「GeoJSONを地図タイルみたいに分割して配信すればいいじゃないか!」
「なるほど。」

4.バイナリベクトルタイル降臨 <ー いまここ
「シリアライズしてバイナリファイルで配信すればより効率的」
「おっ、おぅ」

こんな感じ。

静的バイナリベクトルタイルの作り方

GeoJSONを作る

まず、国土数値情報から取得した47都道府県のshapeファイルをQGISを使って結合し、一つのGeoJSONとしてエクスポートします。
shapeファイルの結合方法は以下を。

08.いくつかのshapeファイルを一つにまとめる – QGIS入門

バイナリベクトルタイルを作る

次にtippecanoeというコマンドラインツールを使って、GeoJSONファイルをバイナリベクトルタイル化します。
brewを使ってインストールします。

今回はズームレベル6〜18までのタイルを作成します。

各オプションの意味は以下となります。

rオプションは、一つのタイルの中に表示する地物の密度を指定します。デフォルトだとズームレベルに応じて表示される数が間引き(省略)されて表示されるのですが、今回はなるべく広い範囲で分布を一瞥できるようにrgオプションで最大レート(50000)を指定しています。

※ ↑完全に理解できているわけではないので説明間違っているかも。

静的ファイルに展開する

[追記]

tippecanoeのアップデートにより、直接静的ファイルを出力することができるようになりました。

-oの代わりに-eオプションをつけることでpbfタイルを指定したディレクトリに直接出力することができます。

したがって、以下mb-utilを使った工程は必要なくなりました。


tippecanoeで出力されるmbtilesファイルは、ベクトルタイルの情報を保存したSQLiteファイルです。このまま利用することもできますが、SQLiteにアクセスできるクライアントが必要になるため、すべてのデータをpbfファイルに展開します。
展開するのにmb-utilというコマンドラインツールを利用しました。
インストールする方法はいくつかありますが、今回はeasy_installを使ってインストールしました。

他のインストール方法については、リポジトリのREADMEを参照してください。

mbutilがインストールできたら、以下のコマンドを実行して静的ファイルへと展開します。

※ 今回は拡張子をpbfにしていますが、今後はmvtにする予定です。理由は後述。

完了するとフォルダ内に展開されたファイルが生成されます。

バイナリベクトルタイル

leafletを使って表示する

web地図クライアントのleafletを使って表示します。バイナリベクトルタイルを表示するたにはLeaflet.MapboxVectorTileプラグインが必要になるので、leafletとともに読み込みます。

サンプルコードをGithubにアップしています。

sample

拡張子について

今回タイルファイルの拡張子をpbfとして生成したのですが、作り直すのも面倒なのでそのまま使っています。
しかし、ファイルサフィックスについては、いろいろと混乱があるみたいなのですが、まぁMapboxのルールに準じるのが無難かと。

Mapbox Vector Tile Specification | Mapbox

Format

Vector tiles are encoded as Google Protobufs (PBF), which allow for serializing structured data. For clarity, Mapbox Vector Tiles use the .mvt file suffix. The specification details are largely structured around the rules implemented in the base .proto file found here.

How are OSM PBF files related to Mapbox Vector Tiles?

They are not related at all. PBFs are a format, much like XML and can take many forms. Mapbox Vector Tiles and OSM PBFs are protobuf files, but conform to completely different specifications and are used in different ways.

Mapboxが提案した構造化データを、Google Protobufs (PBF)規格でエンコードしたものにかんしては.mvt拡張子を使用するよとのこと。OSM PBFファイルとはなんの関係もないよってことらしいです。

デバッグについて

下記の記事を参照してください。

バイナリベクトルタイルのデバッグツール