Splunk: データを点形式で世界地図上に表示する


###### 実施環境： Splunk Free 8.2.2

### 0. 概要

 Splunk にはデフォルトで、世界地図上にデータを表示できる視覚エフェクトが存在します。
今回は、単純に地図上の指定した緯度経度上に点を表示する形式を紹介します。

![WS000024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8483a2f1-8ffa-3d5e-7d1e-48b2f460ceae.jpeg "概要")

### 1. SPL 文の組み方

例として、以下の SPL 文を使用します。

```Splunk:Splunk
| makeresults count=36
| streamstats count AS CNT
| eval latitude = CNT * 2 - 36
| eval longitude = CNT * 10 - 180
| eval SIZE = CNT
| table latitude, longitude, SIZE
```

![WS000024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8483a2f1-8ffa-3d5e-7d1e-48b2f460ceae.jpeg "世界地図")

表としては以下のようになります。
一番上のヘッダ行は、一番左が「latitude」、その右が「longitude」となります。
ヘッダ名を「latitude」「longitude」以外にするとうまく動作しないので注意してください。
一番右のヘッダに入れる文字列はなんでもよいです。
2行目以降は、一番左の列から緯度、経度、点のサイズを入れます。
緯度は-90から90、経度は-180から180の値を入れるようにしてください。

| latitude | longitude | - |
| --- | --- | --- |
| 緯度 | 経度 | 点のサイズ |
| 緯度 | 経度 | 点のサイズ |
| ... | ... | ... |


### 2. 使用方法

 Splunk 視覚エフェクトの「 Cluster Map 」を選択することで使用できます。

![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c4e82d64-230a-9ac8-5305-4cd906c234c7.jpeg "Cluster Map")

### 3. 地図の移動/拡大/縮小

地図は、ドラッグすることで視点を移動させることが可能です。

拡大/縮小を行う場合は、地図の左上端にあるボタンを押します。

![WS000031 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7e01ddef-a11d-f6f6-6afd-1ac90158659d.jpeg "地図操作")

上の2つのボタンは、拡大/縮小を行います。
「 + 」が拡大、「 - 」が縮小です。

![WS000034.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4b1c4888-df87-ffcb-6f1f-616e6246531a.jpeg "拡大縮小")

その下のボタンを押すと、デフォルトの視点に戻ります。

![WS000034 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e70042aa-7348-1c78-5540-2dd58aec64ba.jpeg "デフォルト移動")

デフォルトの視点は、フォーマットの全般タブで指定します。

![WS000029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/af1d54ca-6cbe-f17a-64c2-7a4e76db5fa5.jpeg "全般")

例えば「緯度」を「35」、経度を「135」、ズームを「5」にすると以下の視点がデフォルトになります。

![WS000030.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5b36e5b3-1329-1a82-a964-3c6d7a6b16c1.jpeg "日本")

### 4. マークのサイズ

フォーマットのマーカータブには、「最小サイズ」「最大サイズ」という項目があります。
この設定を変更することで、点のサイズを変更できます。
この設定で変更できるのは純粋に点のサイズのみであり、ここで指定した値より小さいデータや大きいデータが除外されるといったことはありません。

![WS000028.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6f251f1b-6565-5877-65e0-b5ebbbeed06e.jpeg "マーカー")

例えば、最小サイズ1/最大サイズ2の場合は以下のようになります。

![WS000032.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/41704845-9405-43f4-ff03-94c6fd02cad4.jpeg "1-2")

最小サイズ10/最大サイズ100の場合は以下のようになります。

![WS000037.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8e48948f-819b-f1d4-ed01-4aad8eb3f002.jpeg "10-100")

最小サイズと最大サイズの差が大きいほど点のサイズの違いは見やすくなりますが、あまりに小さいサイズや大きいサイズの点は逆にわかりにくくなります。
データの内容などに合わせて適宜変更してください。

### 5. 複数グループでの比較

以下のように緯度経度以外の列が複数ある場合、各点が円グラフの形式となってグループごとの割合を一緒に表示します。

```Splunk:Splunk
| makeresults count=36
| streamstats count AS CNT
| eval latitude = CNT * 2 - 36
| eval longitude = CNT * 10 - 180
| eval SIZE1 = CNT
| eval SIZE2 = 14
| eval SIZE3 = 36 - CNT
| table latitude, longitude, SIZE1, SIZE2, SIZE3
```

![WS000038.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a0b57aa9-4535-1a28-ff5e-e67c8818e22f.jpeg "世界地図2")

| latitude | longitude | グループ名 | グループ名 | ... |
| --- | --- | --- | --- | --- |
| 緯度 | 経度 | 点のサイズ | 点のサイズ | ... |
| 緯度 | 経度 | 点のサイズ | 点のサイズ | ... |
| ... | ... | ... | ... | ... |

### 6. 国の位置に点を合わせる

ここまで表の形式と視覚エフェクトとの関係がわかりやすいように table コマンドを使用してきましたが、これだと点の位置が各国の位置とは全く関係なく配置されてしまい、非常に使用しにくいです。
また、緯度経度の列名をいちいち「latitude」「longitude」に合わせる必要があるのも煩わしいことでしょう。
そこで、 geostats というコマンドが登場します。
 geostats コマンドは stats コマンドとしての機能に加えて、指定した緯度と経度を国ごとに集約してくれる機能が備わっています。
「 Cluster Map 」では通常、この geostats コマンドの結果を視覚エフェクトに利用します。

 geostats コマンドの基本的な文法は以下の通りです。

geostats 関数(集計項目) BY キー項目 latfield=緯度の項目名 longfield=経度の項目名

```Splunk:Splunk
| makeresults count=36
| streamstats count AS CNT
| eval LAT = CNT * 2 - 36
| eval LON = CNT * 10 - 180
| eval SIZE = CNT
| geostats sum(SIZE) latfield="LAT" longfield="LON"
```

![WS000062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/58478005-8688-95c7-b98b-936845e45f58.jpeg "世界地図3")

```Splunk:Splunk
| makeresults count=36
| streamstats count AS CNT
| eval LAT = CNT * 2 - 36
| eval LON = CNT * 10 - 180
| eval SIZE = CNT
| eval GROUP = CNT % 3
| geostats sum(SIZE) BY GROUP latfield="LAT" longfield="LON"
```

![WS000063.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c35b9c48-67b5-8541-18dc-8a2912021938.jpeg "世界地図4")

ちなみに geostats コマンドを使用した場合、以下のように「 geobin 」という集約 ID が記載された列が付与されます。
一応 fields コマンド等でこの列を削除しても視覚エフェクトは生成できますが、そのようなことをする必要はまずないです。

| geobin | latitude | longitude | - |
| --- | --- | --- | --- |
| 集約 ID | 緯度 | 経度 | 点のサイズ |
| 集約 ID | 緯度 | 経度 | 点のサイズ |
| ... | ... | ... | ... |

| geobin | latitude | longitude | グループ名 | グループ名 | ... |
| --- | --- | --- | --- | --- | --- |
| 集約 ID | 緯度 | 経度 | 点のサイズ | 点のサイズ | ... |
| 集約 ID | 緯度 | 経度 | 点のサイズ | 点のサイズ | ... |
| ... | ... | ... | ... | ... | ... |

### 7.  IP アドレスからの緯度/経度の取得方法

さて、ここまで何気なく使用してきた緯度/経度情報ですが、ではそもそも緯度/経度情報はどこから取得すればよいのでしょうか。
ログに緯度/経度そのものが記載されているのならそれを利用すればよいですが、たいていの場合は記載されていないと思われます。
その場合の方法の1つとして、 IP アドレスから位置情報を取得するコマンドが Splunk には存在します。
それが、 iplocation コマンドです。

 iplocation コマンドの基本的な文法は以下の通りです。

iplocation IP アドレス

例えば、「8.8.8.8」( Google Public DNS )を iplocation コマンドにかけると、以下のようになります。

```Splunk:Splunk
| makeresults count=1
| eval ip = "8.8.8.8"
| iplocation ip
```

![WS000039.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8d5992db-ce47-7281-0c01-bb5682300759.jpeg "iplocation")

「 lat 」に緯度、「 lon 」に経度が表示されます。

:::note info
「 Country 」に表示される国名は今回は使用しませんが、また別の形の世界地図のグラフを表示するときに利用できます。
:::

これを geostats コマンドにかけると、ちょうどアメリカ合衆国の位置に点が表示されることが確認できます。

```Splunk:Splunk
| makeresults count=1
| eval ip = "8.8.8.8"
| iplocation ip
| geostats count latfield="lat" longfield="lon"
```

![WS000064.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/52d5bf02-56f9-ffdc-08e1-dd6cd9a8c1cc.jpeg "世界地図5")

ちなみに「 latfield 」「 longfield 」オプションのデフォルトはそれぞれ「 lat 」「 lon 」なので、 iplocation コマンドを利用する場合 geostats コマンドはオプションなしでも動作します。

```Splunk:Splunk
| makeresults count=1
| eval ip = "8.8.8.8"
| iplocation ip
| geostats count
```

![WS000065.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d405e456-d509-2735-d88f-a469595d6ec7.jpeg "世界地図6")