[D3+Leaflet]国土地理院さん渾身のベクトルタイルで遊んでみた。

最終更新日

ベクトルタイルマップ

ベクトルタイルの提供実験について|国土地理院

FOSS4G 2014 Hokkaidoにて会場をザワつかせたベクトルタイルがとうとう公開されました。
私も去年のAdvent Calendarでちょこっとだけ紹介したことがあるのですが、それ以来あまり触っていなかったので、これを機にいろいろ遊んでみました。

道路中心線ベクトルタイル表示サンプル

国土地理院さんが用意してくれた上記サンプルを弄って遊んでいたのですが……サンプルで使われているTileLayer.GeoJSON.jsプラグインでは、オーバーレイされるPathを直接弄る方法が分からず右往左往。
(onEachFeatureのコールバック内でPath要素に直接アクセスできるかな? と思ったのですが、イベント発火時にはDOM上にpathが追加されていないのでアクセスできませんでした)

TileLayer.GeoJSON.jsでもスタイルの指定やフィルタリングなど行えるので特に問題ないのですが、せっかくのベクトルタイルデータ、できることなら道路の一本一本まで自分自身でコントロールしたい!

そう思って、いろいろ探してみたのですがタイルデータロード時にPath要素に直接アクセスする方法を結局みつけられなかったので、TileLayer.GeoJSON.jsを使わず、D3.jsを使って描画するTileLayer.d3GeoJSON.jsを作成しました。

D3.jsで描画しているので、オーバーレイされているPath全てにGeoJSONデータが束縛されています。
これで、いつも通りD3を使っていかようにも操作できますよ!

D3でベクトルタイルを描画する

今のところ、レイヤーコントローラーと連動しないなど、いたるところにバグがあります。例の如くChromeでしか動作確認してません。

こんな感じで使います

遊んでみた

d3.jsを用いてベクトルタイルを描画。道路をクリックすると属性データが見れます。
example1

Path要素にマウスオーバーイベントを設定。国道、市区町村道等、都道府県道、それぞれでマウスオーバーしたときの色を変えてみました。
無駄にアニメーションします。……重いdeth。
example2

zoomレベルに応じて表示する道路を間引いたり線の太さを変えてみたりしました。
間引く道路は、幅(rnkWidth)の値をつかって判別しています。
example3

ベクトルタイルデータは、ラスタタイルに比べて利用する側が好き勝手に操作して遊ぶことができる面白いサービスです。
皆さんもぜひ活用してみてください。