TILE38紹介（2） ：空間系コマンド

|TILE38紹介|
|:---|
|[TILE38紹介（1） ：基本コマンド](https://qiita.com/tesujiro/items/69f8970bd69d501cb0c8)|
|[TILE38紹介（2） ：空間系コマンド](https://qiita.com/tesujiro/items/0a998f2c6e3dd49d7429)|
|[TILE38紹介（3） ：Goプログラムからのアクセス1](https://qiita.com/tesujiro/items/fa7dfc079a94824cc77e)|
|[TILE38紹介（4） ：Goプログラムからのアクセス2](https://qiita.com/tesujiro/items/d9bf26233ce96bc3596f)|
|[TILE38紹介（5） ：Geofencing](https://qiita.com/tesujiro/items/e4b5a3df174e69516553)|

# TL;DR
- 前回記事で基本的なコマンドとして点データの格納と距離にとる参照を紹介した。今回は線やポリゴン（多角形）のデータの格納と検索を実現するコマンドを紹介する。

# コマンド

| コマンド | どんな機能 |
|---------|---------------|
| WITHIN | 指定された地図条件範囲内のデータの検索 |
| INTERSECTS | 線や多角形などの図形と直行するデータまたは含まれるデータの検索 |

# バウンダリの検索

- 複数個登録した境界（バウンダリ：東西南北に沿った境界線）を中心点からの距離で検索する。

```bash:
127.0.0.1:9851> SET example bounds:X BOUNDS 35.6578 139.6971 35.6581 139.6968
{"ok":true,"elapsed":"6.335µs"}
127.0.0.1:9851> SET example bounds:Y BOUNDS 35.6572 139.6984 35.6575 139.6978
{"ok":true,"elapsed":"3.575µs"}
127.0.0.1:9851> SET example bounds:Z BOUNDS 35.6590 139.6967 35.6594 139.6959
{"ok":true,"elapsed":"13.362µs"}
127.0.0.1:9851> WITHIN example IDS CIRCLE 35.6581 139.6975 120
{"ok":true,"ids":["bounds:X"],"count":1,"cursor":0,"elapsed":"66.094µs"}

```

- バウンダリを３つ登録して、WITHIN検索を実行した。
- WITHINでは現在地から半径120メートルを検索範囲とした。
- WITHINは検索範囲内に完全に含んでいるオブジェクトを対象とするため、図の領域Xのみが検索結果となり、領域Y、Zは結果に入らない。
- NEARBYとの違いは、点だけではなく平面領域を検索対象とできることである。

<img width="602" alt="Screen Shot 2019-01-26 at 10.45.39.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/41075/e6f9a6a0-bccf-2ca2-6fad-8c7e40815a6a.jpeg">

```bash:
127.0.0.1:9851> INTERSECTS example IDS CIRCLE 35.6581 139.6975 120
{"ok":true,"ids":["bounds:X","bounds:Y"],"count":2,"cursor":0,"elapsed":"43.576µs"}
```
- コマンドをINTERSECTSにした場合は、検索範囲にオブジェクトの一部でも含まれていると検索結果の対象となることである。

<img width="602" alt="Screen Shot 2019-01-26 at 10.36.39.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/41075/e1bdf17c-13a9-0d7d-caf3-b53d24314f84.jpeg">

# 線やポリゴンの検索

- TILE38の点(POINT),バンダリ(BOUNDS)を使用してきたが、GeoJsonを使用することで線やポリゴンなどの複雑な領域の検索が実現できることを説明する。
- GeoJsonは空間データとその属性情報に関するJSON形式のファイルフォーマットである。（[Wikipedia](https://ja.wikipedia.org/wiki/GeoJSON))
- 空間データとしては点、線、ポリゴン（多角形）とその組み合わせを扱うことができる。
- 以下では検索基準となる領域となるポリゴンと、検索対象となる線、ポリゴンをデータベースに格納し、INTERSECTSコマンドで検索する。

```bash:
127.0.0.1:9851> SET location me OBJECT {"type":"Polygon","coordinates":[[[35.6590,139.6982],[35.6589,139.6978],[35.6577,139.6965],[35.6574,139.6964],[35.6572,139.6966],[35.6575,139.6973],[35.6580,139.6988],[35.6587,139.6984],[35.6590,139.6982]]]}
{"ok":true,"elapsed":"67.481µs"}
127.0.0.1:9851> SET example polygon:P OBJECT {"type":"Polygon","coordinates":[[[35.6587,139.6984],[35.6590,139.6983],[35.6589,139.6979],[35.6586,139.6980],[35.6587,139.6984]]]}
{"ok":true,"elapsed":"43.118µs"}
127.0.0.1:9851> SET example polygon:Q OBJECT {"type":"Polygon","coordinates":[[[35.6591,139.6967],[35.6595,139.6960],[35.6589,139.6958],[35.6586,139.6965],[35.6591,139.6967]]]}
{"ok":true,"elapsed":"37.007µs"}
127.0.0.1:9851> SET example road:R OBJECT {"type":"LineString","coordinates":[[35.6584,139.6954],[35.6567,139.6970]]}
{"ok":true,"elapsed":"29.312µs"}
127.0.0.1:9851> SET example road:S OBJECT {"type":"LineString","coordinates":[[35.6585,139.6994],[35.6575,139.6953]]}
{"ok":true,"elapsed":"55.785µs"}
127.0.0.1:9851> INTERSECTS example IDS GET location me
{"ok":true,"ids":["polygon:P","road:S"],"count":2,"cursor":0,"elapsed":"71.981µs"}
```
- 検索基準となる領域（KEY:location,ID:me)として複雑な多角形（図：緑色）について、複数の検索対象（KEY:example）を検索した。
- 各領域はTILE38ではOBJECTとしてGeoJson形式でパラメータを渡して格納する。
- バウンダリの場合と同様に検索基準に全部または一部が含まれる領域が検索結果に含まれる。（図：青色）逆に検索基準に一部も含まれない領域（図：赤色）は検索結果に含まれない。

<img width="602" alt="Screen Shot 2019-01-26 at 16.49.27.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/41075/d9177430-032d-48eb-98b4-fd505fe77ea0.jpeg">