Region Map で都道府県のデータを描画してみた #Kibana

こんにちは、藤本です。

現地時間 7/6 に Elastic Stack 5.5.0 がリリースされました。

いくつか Elastic Stack 5.5.0 の新機能を試していますのでその他記事は下記をご参照ください。

今回は Region Map にもう少し踏み込んで、Elastic Map Service では描画できない都道府県のデータを描画する方法を紹介します。例として都道府県を描画するだけで同様の方法で市町村や、東日本/西日本といった分割も可能です。それではいってみよう。

Region Map

Region Map の概要に関しては下記エントリをご参照ください。

Kibana 5.5.0 の新機能の Region Map を試してみた

もう少し Region Map の描画について踏み込んでみましょう。Region Map では Tile Map の上のレイヤに Terms Aggregation で集計した結果を GeoJSON に照らし合わせて取得した緯度・経度情報を繋ぎ合わせて、国や都市といった多角形を描画します。一言で表すのは難しい。GeoJSON に関しては Wikipedia をご参照ください。

Region Map 描画の流れはザックリ次のようになる思います。

  • GeoJSON を取得
  • Terms Aggregation でキーと集計値を取得
  • GeoJSON からキーにマッチする空間データ(Polygon)を取得
  • Tile Map の上に描画&集計値に応じた色付け

Region Map で都道府県のデータを描画してみた

デフォルト設定の Kibana では Elastic Map Service からのみ GeoJSON を取得します。Elastic Map Service は国単位、およびアメリカの州単位の GeoJSON を保持しています。デフォルト設定ではそれ以外の Region Map を描画することはできません。でも、日本のシステムであれば、都道府県単位、市町村単位で Region Map 描画したいですよね。描画しましょう!Elastic Map Service から GeoJSON を取得していると言っても、ただやっていることは Web リクエストで GeoJSON を取得しているだけです。なので、都道府県、市町村の GeoJSON を返すことができる Webサーバを用意して、Region Map でその Webサーバから GeoJSON を参照するように設定すれば描画できるはず!

今回も前回同様、ELB のアクセスログを利用して、都道府県単位のアクセス数を描画します。GeoJSON のホスティングには S3 静的ウェブサイトホスティングを利用します。

やることは以下です。

  • S3 静的ウェブサイトホスティングの準備
  • GeoJSON の用意
  • Kibana に Region Map の GeoJSON サーバ指定
  • 動作確認

S3 静的ウェブサイトホスティングの準備

S3 静的ウェブサイトホスティングを準備します。awscli でサクッとバケットを作成して、静的ウェブサイトホスティングを有効化します。

$ aws s3 mb s3://vectormap
$ aws s3 website s3://vectormap --index-document index.html

Kibana からは Javascript でアクセスするので CORS で許可します。AllowedOrigins<Kibana FQDN>は自身の環境に置き換えてください。

$ aws s3api put-bucket-cors --bucket vectormap --cors-configuration '{
  "CORSRules": [{
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET"],
    "AllowedOrigins": ["http://<Kibana FQDN>:5601"]
  }]
}'

GeoJSON の用意

GeoJSON はググると色々とでてきます。今回は Github で公開されていた dataofjapan/landの japan.geojson を利用しました。出典はブログ最下部に記載。

こちらをダウンロードします。既存のままでは今回のデータの都道府県名(Logstash の Geoip filter plugin で置き換えられる都道府県名)とマッチしないので書き換えます。GeoJSON は下記のようなフォーマットなのでnamの値を Elasticsearch にインデキシングされているデータと合わせます。基本的に都道府県の「 To」、「 Fu」、「 Ken」を削除して、北海道は「Hokkaido」に、大阪府は「Ōsaka」に、兵庫県は「Hyōgo」、福島県は「Fukushima-ken」に、滋賀県は「Shiga Prefecture」に、佐賀県は「Saga Prefecture」に書き換えれば良さそうです。

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "nam": "Kyoto Fu",
                "nam_ja": "京都府",
                "id": 26
            },
            "geometry": {
                "type": "MultiPolygon",
                "coordinates": [
                    [
                        [
                            [
                                135.036697387695,
                                35.537334442138686
                            ],
<snip>

修正した GeoJSON ファイルを作成した S3 バケットへアップロードし、アクセス権限を付与します。

$ aws s3 cp japan.geojson s3://vectormap/
upload: ./japan.geojson to s3://vectormap/japan.geojson
$ aws s3api put-object-acl --bucket vectormap --key japan.geojson --acl public-read

Kibana に Region Map の GeoJSON サーバ指定

続いて、Kibana に用意した GeoJSON を参照するように設定します。設定方法は設定ファイル(kibana.yml)に記述します。設定内容は下記をご参照ください。

今回は下記のような設定となりました。

regionmap:
  layers:
  - name: "Japan City"
    url: "http://vectormap.s3-website-ap-northeast-1.amazonaws.com/japan.geojson"
    fields:
      - name: "nam"
        description: "City name"
キー 内容
regionmap.layers.name GeoJSON を取得する対象名。Kibana の Region Map の Vector map の選択肢に表示される
regionmap.layers.url GeoJSON を取得するURL
regionmap.layers.fields.name GeoJSON から空間データを取得するためのキープロパティ
regionmap.layers.fields.description Kibana の Region Map の Join field の選択肢に表示される

設定したら、Kibana を再起動します。

$ sudo systemctl restart kibana

動作確認

それでは Region Map で都道府県単位のアクセス数を描画してみましょう。

Region Map の画面へ遷移します。Options からVector mapJoin fieldkibana.yml に追加したプロパティが表示されました!それぞれを選択します。

Kibana_9 2

Data に移動して、field を都道府県データが入っているgeoip.region_name.keywordを選択します。また今回は日本の都道府県に絞りたいので、フィルタにgeoip.country_name.keyword: "Japan"を設定します。「▶」をクリックします。

Kibana

都道府県毎に集計されたアクセス数が都道府県区切りで表示できました!ある日の弊社ブログの ELB のアクセスログなんですが、東京からのアクセスが圧倒的に多いです!

Kibana 6

GeoJSON があれば簡単に実装することができました。

まとめ

いかがでしたでしょうか? Region Map によって、Kibana の地理データ可視化の利用シーンの幅が確実に広がりました。Region Map も標準では GeoJSON が国単位、アメリカの州単位なのでパターンは少ないですが、簡単に拡張できることがわかりました。

まとめると、

  • 拡張は簡単
  • GeoJSON を自作するのは大変
  • インターネットを検索すれば、GeoJSON は見つかるが、著作権は注意
  • Elasticsearch に入るデータと、GeoJSON のキーを一致させる必要があるので、Synonym などで対応すると楽かも
出典

GeoJSON の地理データは地球地図日本 © 国土地理院 のデータを利用しています。