KibanaのTileMapにOpenStreetMapを利用する

elastic_kibana

こんにちは、藤本です。

先日、同僚にKibanaのTileMapでもっと詳細なマップが表示できないか聞かれたので調べてみました。

MapQuestの利用不可

screenshot 2016-09-02 11.33.02

衝撃だったのですが、先日 Kibana の TileMap へアクセスしたところ、↑のような画面表示となっていました。同じ衝撃を受けた方も多いかと思います。
今まで Kibana は MapQuest が提供するTileサービスのAPIを利用していましたが、2016年7月11日を持って、MapQuest が API の提供を終了しました。それにより Kibana 4.5.2、4.1.9 以前の Kibana は TileMap にて地図を表示できなくなっています。

Elastic社はこの問題に対処するためにElasticアプリケーションのみで利用可能な Tileサービスの提供を開始し、4.5.3、4.1.10 からそちらを利用するように修正されました。Kibana 4.5.3、4.1.10 移行へのバージョンアップによりこの問題を解消できます。

詳細は Kibana 4.5.3、4.1.10 のリリースブログをご参照ください。

Amazon Elasticsearch Serviceをご利用の場合、2016年9月2日時点ではどうすることもできません(悩

Elastic Tile Service

Elastic Tile Serviceは現時点で2つの制限事項があります。

  • ズームレベルが8までしか対応していない
  • 情報が少ない

参考までに最大ズーム状態でのキャプチャです。

Visualize_-_Kibana

うーん。。

Custom Tile Service

4.5.3、4.5.10 からデフォルトは Elastic Tile Service の設定となりましたが、Tileマップサービスを利用できるようになりました。例えば、Github の Issue で取り上げられていますが、OWS terrestris のTileサービスを利用することが可能です。

Map visualizations not working anymore #7717

ただ表示内容が文字化けしているのか、情報が表示されません。

Visualize_-_Kibana 2

うーん。。。

今回やりたかったこと

  • 駅などが識別できるレベルにズームしたい
    • 高ズームレベルに対応したTile Serviceの利用
    • ズームレベルの調整
  • 上記レベルにズームした時にピンポイントに位置を表示したい
    • Aggregation 範囲の詳細化

高ズームレベルに対応したTile Serviceの利用

Tile Service を探していたところ、見つけました。弊社ブログエントリで。

OpenStreetMapサーバを自作する(Install OpenStreetMap on AWS EC2/Ubuntu14.04)

OpenStreetMap サーバを構築し、Kibana の Custom Tile Service で OpenStreetMap サーバの参照するように指定すれば、イケるんじゃね!?

やってみましょう。

OpenStreetMap サーバ構築

OpenStreetMap サーバの構築方法は上記ブログエントリをご参照ください。

参照先 Tile Service 設定

Kibana の設定ファイルに参照先 Tile Service の URL 指定を追記します。

  • /opt/kibana/config/kibana.yml (RedHat系OSの場合)
tilemap.url: "http://<OpenStreetMapサーバのURL>/osm/{z}/{x}/{y}.png"

Kibana のサービス再起動

設定ファイル変更後は Kibana を再起動します。

# systemctl restart kibana

動作確認

ウェブブラウザを起動し、Kibana の WebGUI へアクセスします。

Visualize -> Tile map の順に選択します。

Visualize_-_Kibana 4

Visualize_-_Kibana 5

今回は日本の地図データしか取り込んでいないため、東京辺りを拡大します。

Visualize_-_Kibana 6

日本語でいい感じに表示されていますね。

ただデフォルト設定ではこれ以上ズームできません。

ズームレベルの調整

Kibana はデフォルトのズームレベルが 10 までに制限されています。ズームレベルの制限は上記と同じく Kibana の設定ファイルにて調整可能です。

最大ズームレベルの設定

  • /opt/kibana/config/kibana.yml (RedHat系OSの場合)
tilemap.options.maxZoom: 18

今回利用した OpenStreetMap の地図データがズームレベル18まで対応していました。

ちなみに Elastic Tile Service、OpenStreetMap に関わらず、Tile Service が対応していないズームレベルを指定した場合は画像データが取得できないため、画面は真っ白となります。

Kibana のサービス再起動

設定ファイル変更後は Kibana を再起動します。

# systemctl restart kibana

動作確認

ウェブブラウザをリロードし、弊社ホームグラウンドの秋葉原を最大限に拡大してみます。

Visualize_-_Kibana 7

建物一つ一つまで判別できるようになりました。

ただ今回、秋葉原駅、アキヨドの緯度経度をインデックスしているのですが、正確な位置情報が分かりません。

Aggregation 範囲の詳細化

Kibana のUI設定では Geohash grid Aggregation の範囲 (Precision) を 1〜7 まで調整可能です。しかし、Geohash grid Aggregion 自体は 1〜12 までで指定可能です。

Geohash grid Aggregation

今回のようにズームレベル 18 まで設定すると、Precision 7 では正直物足りないです。そこで Kibana ではこの値を上書きする Option があります。

Advanced の JSON Input で Precision の設定を上書き指定します。

Visualize_-_Kibana 8

秋葉原駅、アキヨドの正確な位置にレンダリングできました。

目標達成できました。

まとめ

いかがでしたでしょうか?

今回は要件により、地図データの入れ替え、ズームレベルの変更など大きくカスタマイズしましたが、ソースコードを一切修正することなくできたのは、Kibana のカスタマイズ性の素晴らしさだと思います。
今回の件に限らず、Elasticsearch、Logstash、Kibanaのプラグイン対応、独自Beatsのジェネレータの準備など Elastic プロダクトはカスタマイズ性が高く、ユーザーが自身の要望を実装できる土台が整っているところも大きな魅力だと思っています。