[12屆 鐵人賽] [Day25]
Spatial values - Neo4j 與經緯度
===
###### tags: `iT鐵人賽` `Neo4j`
## 前情提要
剛剛房間出現一隻蟑螂,好像是從窗戶飛進來的
對,沒錯,他會飛
經過半小時的抗戰,把他趕到了隔壁房間
拿出了殺蟲劑,直接對他爆噴
明顯聽到他在櫃子下掙扎的聲音
現在,我對隔壁房間的所有地方都噴了滿滿的殺蟲劑
然後關了門,把門的四個邊都噴到爆
又扯太遠了
直前在[第八篇](https://ithelp.ithome.com.tw/articles/10241657)有提到了 Neo4j 可以存所謂的 "空間座標"
有鑑於之前有做過 GIS 的經驗,今天就來講講這個主題吧
## 座標參考系統 ( Coordinate Reference Systems )
在講 Neo4j 的空間座標之前,要先講講關於空間座標的基本觀念
> 直接講結論,畢竟不是專業領域,以策安全不要提細節
在台灣比較常見的標準有
* TWD67
* TWD97
* WGS84
其中 TWD 開頭的那兩個為台灣地區所使用的標準,不重要
今天主要的內容會環繞在 `WGS84`
### WGS84 ???
WGS84 為目前世界上最常使用的標準
我們常用的 GPS 通常也是使用這套標準
不要太複雜,你直接把他理解成經緯度就可以了
也就大家應該又看過的這東西 --> ( 24.1436026 , 120.7286986 )
## Neo4j - Spatial values
那 Neo4j 的空間座標呢,在 Neo4j 裡空間座標主要以兩個系統為主
* 地理座標系 (Geographic coordinate system)
* 就是剛剛提的座標參考系統
* 笛卡兒座標系 (Cartesian coordinate system)
* 又稱 直角坐標系
* 對,就是國高中學的那個數學座標啦
直角坐標系這邊就不多提,在 Neo4j 中的地理座標系主要有兩種形
* WGS84 2D
* 經度、緯度
* WGS84 3D
* 經度、緯度、高度
通常的寫法長成這個樣子
```javascript
point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')})
```
### distance()
在 Neo4j 中你可以抓取兩個點的距離
假設,我想知道我的大學跟我今天剛跑的赤崁頂平面直線距離多遠的話
首先先變出兩個點的位置
我的大學
```javascript
point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')})
```
赤崁頂
```javascript
point({ latitude:toFloat('24.094066'), longitude:toFloat('120.804041')})
```
然後下這段
```javascript
WITH point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')}) AS p1,
point({ latitude:toFloat('24.094066'), longitude:toFloat('120.804041')}) AS p2
RETURN distance(p1,p2)/1000 AS km
```
就可以簡單地取得距離了

~~啊,走 136 google 跟我說是 17 km,山路直接繞兩倍 WTF~~
### 結合 Node
當然在 `Node` 中也是可以存空間值的
類似這樣
```javascript
CREATE (:Map{map:point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')})})
CREATE (:Map{map:point({ latitude:toFloat('24.094066'), longitude:toFloat('120.804041')})})
```

來做跟剛剛一樣的事吧
```
MATCH (n),(m) where id(n)=0 AND id(m)=1
RETURN distance(n.map,m.map)/1000 as KM
```

嗯,是一樣的結果呢,~~廢話~~
---
在不收尾就要爆啦
Neo4j 的空間座標差不多就是這些內容了
剩下的 WGS84 3D、笛卡兒座標系,基本上大同小異
就不多說了
以上,這個主題寫起來還滿有趣的ww
下篇 **打打看 Neo4j Http Api 吧**
究竟鐵人賽能不能完賽呢,讓我們繼續看下去
---
## 參考資料
[Neo4j - Spatial values](https://neo4j.com/docs/cypher-manual/current/syntax/spatial/)
## 紀錄
撰寫日期:2020/10/09
耗時: 1.5 小左右