Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Kibana Custom Mapで地図可視化 #1 独自の地図を簡単に設定

こんにちは、Elastic認定アナリストのshiroiです。
業務では、Kibanaでビジネスログやセキュリティ情報の可視化を行っています。

Kibanaで地図を活用した可視化を行う場合、
標準で用意されている世界地図や日本地図の上にデータを描画することが一般的ですが、
独自に作成した地図(Custom Map)を利用することも可能です。

本ブログでは、KibanaでCustom Mapを利用する方法を紹介します。

Custom Mapのユースケースと利用方法

国/県/地域など、広いエリアにおける可視化を行う場合、標準で用意されている世界地図/日本地図を利用します。
一方で「遊園地/アウトレットモールなどの施設」や「オフィス/会議室などの建物内エリア」など、
標準地図でカバーできない限定エリアにおける可視化を行う場合には、Custom Mapを利用します。

KibanaでCustom Mapを利用するには、2つの方法があります。

  1. 「Elasticsearch」からCustom Mapを読み込む
  2. 「GeoServer」からCustom Mapを読み込む

1. 「Elasticsearch」からCustom Mapを読み込む

ElasticsearchからCustom Mapを読み込む場合、Shapeファイルを利用します。

Shapeファイルとは、「地形などの図形情報と、地名や位置などの属性情報をもった地図データ」が集まったファイルです。
Kibana Mapsでは、Shapeファイルを登録するだけでCustom Mapを利用可能であるため、
手軽に独自の地図で可視化をしたい場合におすすめのアプローチです。

一方、地図の拡大縮小に合わせて、表示するラベルのサイズを変更したり、複数の地図のデザインを統一するような細かな制御ができません。

2. 「GeoServer」からCustom Mapを読み込む

GeoServerは、地理情報を編集し、地図情報を配信することが可能なOSSです。
このGeoServerを使えば、CSSのような設定で複数の地図に対して、デザインを統一することや、
拡大縮小に合わせて、表示するラベルの制御を行うことが可能です。

注意点として、ブラウザが直接GeoServerと通信して地図情報を読み込む仕様であるため、
不特定多数の人が利用するにはGeoServerを一般公開する必要があります。
どちらかというとイントラネットでの利用に向いています。

本記事では、1の「Elasticsearch」からCustom Mapを読み込む方法を解説します。
2のGeoServerを使用したKibana Mapsでの可視化は、別の記事で紹介する予定です。

今回書かないこと

今回は、以下の内容は、対象外とします。

  • Shapeファイルの作り方
  • GeoJSONの作り方

GeoJSONとは、位置情報とその位置についてのラベル情報や形状(点や矩形など)情報を持ったJSONです。

実際に試してみる

今回は、コワーキングスペースの可視化を想定し、1週間の平均利用時間と各部屋のWifi強度を可視化します。
インデックスは以下です。

インデックス名:room-availability-weekly-yyyy-MM-dd

フィールド名 概要
room_name ルーム名
use_count ルームの利用回数
use_date ルームの利用日時
use_hours ルームの利用時間
wifi_intensity wifiの強度

独自の地図(Shapeファイル)の登録

最初にコワーキングスペースの1フロアを表示するShapeファイルを作成します。
Shapeファイルを作成する時は、IllustratorQGISなどを利用するとよいでしょう。
Shapeファイルを作成すると、以下4種の形式のファイルが作成されます。

  • shp
  • dbf
  • prj
  • shx

上記4種全てを、Kibana Maps画面の「Add layer」を選択し、「Upload file」から登録します。

Shapeファイル群を登録

4つのファイルを登録すると、以下のような画面になります。
登録したShapeファイル群は、indexとして登録されます。

Shapeファイル群登録後の画面

index名を入力し、登録した後は、「Add as document layer」をクリックして、レイヤー名や表示する不透明度、登録した地図の色を設定します。
ここでは、地図の不透明度を100%とします。

レイヤー名と不透明度を登録

表示したい地図が固定されるように、以下のFilteringのチェックを外しておきます。

Filteringの設定変更

Layer Styleで地図に塗る色を設定後、保存します。
これで地図部分は完成です。
レイヤー別に塗り色を変える必要があるため、今回は以下3つに分けて独自の地図を作成しました。

  • 部屋の枠と床の部分
  • 机と椅子
  • ルーム名

各地図について、それぞれ同じ操作を繰り返して登録します。
順番に登録していくと以下のような地図になります。

地図の登録完了

GeoJSONの登録

ShapeファイルをGeoJSONファイルにコンバートしましょう。
Kibana Maps画面の「Add layer」を選択し、「Upload file」から生成したGeoJSONを登録します。
この時に、Shapeファイル登録時と同様に、index名を指定します。

GeoJSONを登録

「Add as document layer」をクリックし、レイヤー名や不透明度を設定します。
Terms joinsで登録したGeoJSONで指定されたエリアをデータの値別に色が塗られるようにします。

GeoJSONで指定したエリアとコワーキングスペース利用時間のデータを紐づける

平均時間を表示するため「avg」を選択

色設定では、「By Value」にすることで、値別に塗り色を変えることができます。

「By Value」で値別に色を塗る

これで設定は完了です。

データを表示すると以下のようになります。
この図面では、各部屋の利用時間が長ければ長いほど、濃い赤になり、利用時間が短ければ短いほど、薄い赤になります。

独自の地図の可視化完成

上記の地図では、GeoJSONで矩形表示をできるように設定していました。
エリアの中心に位置情報を設定したGeoJSONを登録すれば、以下のように円の色やサイズでWifi強度を表現することも可能です。
Wifi強度が強ければ強いほど、オレンジ色で丸の大きさが大きくなります。
弱いところは、青色で丸の大きさも小さくなります。

点で表示する場合の例

まとめ

今回は、簡単に独自の地図で可視化したいときの作り方を解説しました。
次回は、GeoServerを使用して、より高度なCustom Mapを作成する方法を紹介します。