waigani's diary

QGISを中心にFOSS4Gをいじくる

国土地理院のベクトルタイルをQGISに読み込んでみる

ベクトルタイルの提供実験

国土地理院のベクトルタイルの提供実験が行われています。
ベクトルタイルの提供実験について|国土地理院

早速、D3.js+leafletで表示している方も。
[D3+Leaflet]国土地理院さん渾身のベクトルタイルで遊んでみた。 | GUNMA GIS GEEK

乗り遅れるわけにはいかないので、QGISで強引に表示してみます。

今回試してみた方法

道路中心線のベクトルタイルはGeoJSONで提供されています。QGISでは一般的なベクトルデータを読み込む際は、OGRというベクトルデータを扱うライブラリを利用しています。OGRはGeoJSONにも対応していますので、QGISでGeoJSONをそのまま読み込むことが出来ます。

試しに提供されているベクトルタイルを1枚ダウンロードしておいて、QGISに表示してみましょう。
http://cyberjapandata.gsi.go.jp/xyz/experimental_rdcl/15/29132/12853.geojson

特に気をつける点もなく表示されます。
f:id:waigani:20140809151003j:plain

キャンパスの地理座標範囲からタイルファイルのズームレベル、X、Yを求めて、必要なファイルさえわかれば、後はGeoJSONにネット越しに直に、もしくは一旦ダウンロードしておいて表示することが出来ます。もちろん、キャンパスの縮尺の変更、表示範囲の変更に合わせて、ファイルの読み込み直しは必要になります。

今回は、キャンバスがリフレッシュされるタイミングで必要なタイルを計算して、1ファイルを1レイヤとして読み込んでみました。
拾うイベントがこれでいいのかとか、グループ消された時の処理とか、プラグイン消された時の処理とか色々考えるべきですが、まずは表示するというところをやってみたということで。

作ったプラグイン

プラグイン

GitHubに置いておきます。ユーザーディレクトリ\.qgis2\python\pluginsにコピーしてお試し下さい。
https://github.com/waigania13/vectorTileswaigania13/vectorTiles · GitHub

実行

【プラグイン】メニューに【vector tiles】→【国土地理院ベクトルタイル提供実験】が出来ますので、実行してみてください。
f:id:waigani:20140809154940j:plain

表示

つくば周辺に移動してベクトルタイルが表示されます。
f:id:waigani:20140810224101j:plain

注意

ogrではgeojsonへのupdateをサポートしてない旨、エラーがいっぱい出ますので注意してください。

処理内容

ズームレベルを求める

少々手抜き。キャンパス上の縮尺500をズームレベル20と仮定して、なんとなく求めます。

X,Yを求める

こんな関数を用意しておきました。この辺はタイルマップの説明をググっていただくと、色々資料があるかと。

vectortiles.py

主な処理を行っているファイルの中身です。

  • 102-103行 : キャンバスの表示範囲を経緯度で持って来ます
  • 106-108行 : 南西、北東のズーム、X、Yの決定
  • 112-119行 : 必要なファイルを決める、すでに読み込まれている時は改めて読み込まない
  • 132-139行 : 必要なタイルの読み込み
  • 143行 : 前回表示範囲のファイルと、今回の表示範囲のファイルを比較、必要無いレイヤは消す

とかやってます。
レイヤへのファイルの読み込みは、ネット越しに直に行っています。
124-130行のコメントアウトを外して、132行目をコメントアウトすると、ファイルを一時フォルダにダウンロードしてきた上で読み込みになります。


つづきあるかな...

別々のレイヤとして読まずに1つのレイヤに入れた方がスタイル付けるの楽ですよね。OpenLayers Pluginを改造した方が賢いかな。誰か任せた。