[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 ``` 就可以簡單地取得距離了 ![](https://i.imgur.com/OAwbvPe.png) ~~啊,走 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')})}) ``` ![](https://i.imgur.com/DAlHYYm.png) 來做跟剛剛一樣的事吧 ``` MATCH (n),(m) where id(n)=0 AND id(m)=1 RETURN distance(n.map,m.map)/1000 as KM ``` ![](https://i.imgur.com/kCAesTR.png) 嗯,是一樣的結果呢,~~廢話~~ --- 在不收尾就要爆啦 Neo4j 的空間座標差不多就是這些內容了 剩下的 WGS84 3D、笛卡兒座標系,基本上大同小異 就不多說了 以上,這個主題寫起來還滿有趣的ww 下篇 **打打看 Neo4j Http Api 吧** 究竟鐵人賽能不能完賽呢,讓我們繼續看下去 --- ## 參考資料 [Neo4j - Spatial values](https://neo4j.com/docs/cypher-manual/current/syntax/spatial/) ## 紀錄 撰寫日期:2020/10/09 耗時: 1.5 小左右