バイナリベクトルタイルをQGISで表示する

これはベクトルタイル Advent Calendar 2017 9日目の記事です。

hfuさんの記事でベクトルタイルの理解が深まってきたので、このへんで実際にQGISを使ってベクトルタイルを見てみましょう。
ベクトルタイルはWebGIS界隈で整備が進んできましたが、ここになってデスクトップGISへの逆輸入も始まっているようです。


ArcGIS Pro:
https://pro.arcgis.com/ja/pro-app/help/data/services/use-vector-tiled-layers.htm
QGIS:
https://github.com/geometalab/Vector-Tiles-Reader-QGIS-Plugin


ということで、今回はバイナリベクトルタイルをQGISで表示してみます。



バイナリベクトルタイルをQGISで表示

QGISでバイナリベクトルタイルを表示してみる

QGISでバイナリベクトルタイルを表示するには、Vector Tiles Reader Pluginを使用します。QGIS 2.18以上で動作します。

1. QGIS 2.18にVector Tiles Reader Pluginを入れます。

プラグインの管理の設定画面で、「実験的プラグインも表示する」にチェックを入れるとリストに表示されます。

2. メニューから ベクタ > Vector Tiles Layer > Add Vector Tiles Layer..と選びます。

デフォルトで、以下のOベクトルタイルの配信データがセットされています。

  • Mapzen.com
  • OpenMapTiles.com
  • OpenMapTiles.com(with custom key)

これはOSMのデータをベクトルタイルに変換したもので、Mapzenバージョン、OpenMapTilesバージョンが選択できます。
何が違うのかはhfuさんのこちらの記事が参考になります。

https://qiita.com/hfu/items/a761c5875d73c164bcd4
https://qiita.com/hfu/items/afbafacb70197711ee29

3. 「Connect」を押してレイヤ情報を取得します。

レイヤの一覧が表示され、表示オプションを設定できます。
表示オプションは、「Base Map defaults」、「Analysys Defaults」、「Inspection Defaults」、「Manual」がセットされています。

  • Base Map defaults:表示用。JSONのスタイルを適用。32タイルを読み込み
  • Analysys Defaults:分析用。タイルの境界バッファ部分を切り取り、すべてのタイルをマージ。16タイル読み込み
  • Inspection Defaults:確認用。1タイルのみ読み込み。
  • Manual:自分でオプションを設定


4. 「Add」ボタンを押して、表示します。



たったこれだけで、全国編集可能なOSMのデータが取得できてしまいます。ベクトルタイル便利ですねー

※ちょっと前に試した時は、デフォルトのスタイルをいい感じで付けてくれてたけど、今日、プラグインをアップデートしたら、いまいちなスタイルになってました。まあ、そのへんは開発途中ということで。


こうなってくるとベクトルタイルも自分で作って、QGISで表示させたくなります。
ということで、、、

shpファイルからバイナリベクトルタイルを作る

自分のshpファイルからバイナリベクトルファイルを作ってみましょう。

1. shpファイルを用意します。

今回は、植生図のデータを利用しました。
http://gis.biodic.go.jp/webgis/sc-023.html

2. shpファイルをgeojsonに変換します。

QGISでgeojson形式で書き出せばOKです。

3. tippecanoeを用意します。

Windowsでtippecanoeを利用するために、Bash on Ubuntu on Windowsを入れておきます。インストール方法はググってください。
tiooecanoeのソースコードをダウンロードします。

https://github.com/mapbox/tippecanoe


bashコンソールでgit clone すればダウンロードできます。

git clone https://github.com/mapbox/tippecanoe.git


tippecanoeをコンパイルします。コンパイルに必要なソフトをapt-getでインストールしてからmakeします。

cd tippecanoe
sudo apt-get install make g++ sqlite3 libsqlite3-dev zlib1g-dev 
make
sudo make install
6. tippecanoeでgeojsonをpbf(mvt)に変換します。

以下のコマンドでgeojsonをpbfファイルに変換します。ファイルはvegフォルダに1/1/1.pbfのように作られます。変換オプションで、ズームレベルや簡素化なども設定できます。

 tippecanoe -e veg veg.geojson


以下のコマンドだと、mbtiles形式になります。

 tippecanoe -o veg.mbtiles veg.geojson


tippecanoeで変換すると拡張子はpbfとなるようですが、vector-tile-specを読むとmvtとすべきみたいですね。
https://github.com/madefor/vector-tile-spec/blob/master/2.1/README.md


バイナリベクトルタイルをネットで配信してQGISで表示する

バイナリベクトルタイルができたのでQGISで読み込めるように配信してみましょう。

1. レイヤ情報のtile.jsonを作成します。

Vector Tiles Reader Pluginにレイヤの情報を教えるために、tilejson形式のtile.jsonを作成します。

https://github.com/mapbox/tilejson-spec/tree/master/2.2.0


tilejsonのspecはリンクの通りですが、プラグインでは最低限の情報があれば大丈夫そうです。
tilesのURLは、配信場所のURLに合わせます。boundsやcenterはtippecanoeで変換されたvegフォルダの中のmetadata.jsonに書かれています。


こんな感じです。

{
  "tilejson": "2.2.0",
  "tiles": ["https://map.ecoris.info/mvt-tiles/veg/{z}/{x}/{y}.pbf"],
  "name": "veg mvt",
  "attribution": "Biodiversity Center of Japan",
  "maxzoom": 14,
  "minzoom": 0,
  "bounds": [140.746596,37.836344,140.871589,37.919672],
  "center": [140.767822,37.848832,14],
  "vector_layers": [{
    "id": "veg",
    "description": "vegetation data (Biodiversity Center of Japan)",
    "maxzoom": 14,
    "minzoom": 0
  }]
}
2. データをサーバーにアップロードします。

tile.jsonをvegフォルダの中に入れて、ウェブサーバーにアップロードします。

3. プラグインにタイル情報を登録します。

QGISのメニューからベクタ > Vector Tiles Layer > Add Vector Tiles Layer..で「New」を選択して、Nameとtile.jsonのURLを登録します。今のところNameに日本語は入れられません。


4. ConnectしてAddして表示します。

これで自分のベクトルタイルが表示されます。ベクトルタイルなので、自分の好きなように着色したり編集できます。読み込みオプションで結合していない場合は、境界部分のバッファーに重なりがあります。



おまけ github上のベクトルタイルをQGISで読み込む

hfuさんがgithubでベクトルタイルを公開されているので、それをQGISで読み込んでみます。

試しに、このベクトルタイルを表示してみます。
https://github.com/hfu/chome-vt


自分のgistでレイヤ情報を作成します。
https://gist.github.com/tmizu23/5d427e657e6553c361881a3ec16683ed


RAWボタンを押して、そのURLをプラグインのタイル情報のTile Json URLに設定します。


もちろん、属性のラベルも表示できます。


おまけ mbtilesをQGISで読み込む

tippecanoeでmbtilesに変換した場合も、Vector-Tiles-Readerで表示できます。
QGISのメニューからベクタ > Vector Tiles Layer > Add Vector Tiles Layer..で「MBTiles」タブを選択して、ファイルを選べばOKです。


※pbfも「Directoris」タブで読み込めるはずですが、属性に日本語があるとmetadata.jsonの読み込みでエラーになるようです。(こっちはmetadata.jsonを参照するようです。)

まとめ

バイナリベクトルタイルもQGISでデータを取得、表示できるようになってきました。ベクトルタイルは、データそのものなので、編集も着色も自由にできます。WebGIS用と思われているベクトルタイルですが、その恩恵はデスクトップGISにもありそうです。バイナリベクトルタイルの普及が進んで、県ごとのshpファイルを別々にダウンロードして、解凍して、結合してみたいな面倒なことをしなくて済むようになると良いですね;-)



(そういえば、WFSってのが昔あった気がしますが、どうなったんですかねー?)


来週は、Vector-Tiles-Readerのソースコードを移植して、Rでバイナリベクトルタイルを読み込めるようにしてみたいと思います。


では、また。