Taste of Tech Topics

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

Kibana Custom Mapで地図可視化 #2 独自の地図にスタイルを設定

この記事は Elastic Stack (Elasticsearch) Advent Calendar18日目の記事です。

こんにちは、Elastic認定アナリストのshiroiです。

前回のブログでは、「Elasticsearch」からCustom Mapを読み込む方法について紹介しました。

参考:
acro-engineer.hatenablog.com

おさらいをすると、KibanaでCustom Mapを読み込む場合には、以下の2つの方法があります。

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

第二弾では、「GeoServer」からCustom Mapを読み込む方法を紹介します。

Geoserverとは

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

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

利用したい環境に合わせて、以下のサイトから構築用のファイルをダウンロードできます。

GeoServer:https://geoserver.org/

今回書かないこと

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

  • Shapeファイルの作り方
  • GeoJSONの作り方
  • GeoServerに地図データ(Shapeファイル)を登録する方法の詳細
  • 登録した地図データにデザインを適用する方法の詳細

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

GeoServerでShapeファイルを登録する方法と地図データにデザインを適用する方法は、以下のドキュメントを参照ください。

Shapeファイルを登録:
https://docs.geoserver.org/latest/en/user/gettingstarted/shapefile-quickstart/index.html

地図データにデザインを適用:
https://docs.geoserver.org/latest/en/user/styling/index.html#styling

実際に試してみる

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

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

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

GeoServerに登録した地図をKibana Mapsに登録

GeoServer構築には以下のDockerイメージを利用しました。
https://hub.docker.com/r/kartoza/geoserver

GeoServerに、前回のブログで記載した時と同じShapeファイルを登録します。
以下3つの独自の地図を表示できるようにします。

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

GeoServerを使用した場合、Powerpointのオブジェクトのグループ化のように、レイヤーをグループ化することができます。
ここでは、「部屋の枠と床の部分」と「机と椅子」のレイヤーグループを作成しました。

GeoServerでレイヤーグループを設定:
https://docs.geoserver.org/latest/en/user/data/webadmin/layergroups.html

また、GeoServerでXML形式のスタイルを設定することで、地図の各レイヤーごとに色を塗ることができます。

GeoServerに登録後、Kibana Maps画面の「Add layer」を選択し、「Web Maps Service」を選択します。

「Web Map Service」を選択

Kibana Mapsの「Web Maps Service」を使用する場合、以下のようなURLを指定することで、GeoServerに登録した地図のレイヤーを呼び出すことができます。

http://localhost:8600/geoserver/{登録した地図の名前}/wms

「Web Maps Service」を選択後、以下のような画面となるので、使用したい地図のURLを入力します。

GeoServerに登録した地図を呼び出す

「Load capabilities」をクリックすると、GeoServerに登録した地図のレイヤーを選択することができます。
まずは、GeoServerで事前にレイヤーをグループ化した、コワーキングスペースの「部屋の枠と床の部分」と「机と椅子」を表示するためのレイヤーを登録します。

表示したいレイヤーを選択

レイヤー名を入力し、設定を保存します。

レイヤー名を設定

これで地図部分は完成です。
ルーム名が一番上に表示されるようにする必要があるため、ルーム名を表示するレイヤーを同じ操作で登録します。

登録後、以下のような地図になります。

レイヤーの登録完了後のKibana Maps

GeoServerでスタイルを設定することで、地図が拡大されたらラベルを表示し、地図が縮小されたらラベルを非表示にすることができます。

地図が縮小されると、ラベルが非表示になる。

このスタイルを有効活用することで、Google Mapsのように、地図の表示を制御していくことができます。

以下は、ラベルの表示/非表示を設定する場合のスタイル(XML)の一例です。

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
  xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NamedLayer>
        <Name>room name</Name>
        <UserStyle>
            <Title>room name style</Title>
                <FeatureTypeStyle>
                <!-- ポリゴンサイズに合わせて、四角が塗られないように透明色をセット -->
                <Rule>
                    <PolygonSymbolizer>
                        <Fill>
                            <CssParameter name="fill">#F9F9F9</CssParameter>
                            <CssParameter name="fill-opacity">0</CssParameter>
                        </Fill>
                        <Stroke>
                            <CssParameter name="stroke">#EFEFEF</CssParameter>
                            <CssParameter name="stroke-width">0</CssParameter>
                        </Stroke>
                    </PolygonSymbolizer>
                </Rule>
                <!-- ズームレベルが3以上4未満の場合は、ラベルをfont size:10で表示。 -->
                <Rule>
                    <Name>Medium</Name>
                    <MinScaleDenominator>20000000</MinScaleDenominator>
                    <MaxScaleDenominator>30000000</MaxScaleDenominator>
                    <TextSymbolizer>
                        <Label>
                            <ogc:PropertyName>room_name</ogc:PropertyName>
                        </Label>
                        <Font>
                            <CssParameter name="font-family">Arial</CssParameter>
                            <CssParameter name="font-style">normal</CssParameter>
                            <CssParameter name="font-weight">bold</CssParameter>
                            <CssParameter name="font-size">10</CssParameter>
                        </Font>
                        <LabelPlacement>
                            <PointPlacement>
                                <AnchorPoint>
                                    <AnchorPointX>0.5</AnchorPointX>
                                    <AnchorPointY>0.5</AnchorPointY>
                                 </AnchorPoint>
                            </PointPlacement>
                        </LabelPlacement>
                        <VendorOption name="partials">true</VendorOption>
                        <VendorOption name="polygonAlign">ortho</VendorOption>
                    </TextSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

GeoServerを利用した地図のスタイル設定の詳細は、以下を参照してください。

地図データにデザインを適用:
https://docs.geoserver.org/latest/en/user/styling/index.html#styling

ドキュメントを登録

Kibana MapsからGeoJSONを一度登録すると、登録したデータをindexとして参照することができます。
「Add Layer」から「Documents」を選択し、前回登録したindex(GeoJSONデータ)を呼び出します。

「Add Layer」から「Documents」を選択

登録済みのドキュメントを呼び出す

レイヤー名や不透明度を設定します。
Terms joinsで登録したドキュメントで指定されたエリアをデータの値別に色が塗られるようにします。

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

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

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

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

これで設定は完了です。

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

独自の地図の可視化完成

まとめ

今回は、GeoServerを使用して、より高度なCustom Mapを作成する方法を解説しました。
GeoServerを使用することで、より細かなスタイル設定ができます。
使用したい地図の複雑さにもよりますが、それぞれのメリット・デメリットも踏まえて、最適な地図可視化を選択していきたいですね。

それでは。



Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com