iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

圖形資料庫是什麼,可以吃嗎 - Neo4j系列 第 25

Spatial values - Neo4j 與經緯度

前情提要

剛剛房間出現一隻蟑螂,好像是從窗戶飛進來的

對,沒錯,他會飛

經過半小時的抗戰,把他趕到了隔壁房間

拿出了殺蟲劑,直接對他爆噴

明顯聽到他在櫃子下掙扎的聲音

現在,我對隔壁房間的所有地方都噴了滿滿的殺蟲劑

然後關了門,把門的四個邊都噴到爆

又扯太遠了

直前在第八篇有提到了 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
    • 經度、緯度、高度

通常的寫法長成這個樣子

point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')})

distance()

在 Neo4j 中你可以抓取兩個點的距離

假設,我想知道我的大學跟我今天剛跑的赤崁頂平面直線距離多遠的話

首先先變出兩個點的位置

我的大學

point({ latitude:toFloat('24.1436026'), longitude:toFloat('120.7286986')})

赤崁頂

point({ latitude:toFloat('24.094066'), longitude:toFloat('120.804041')})

然後下這段

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 中也是可以存空間值的

類似這樣

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


排版好看的版本同步更新在我的 HackMD


上一篇
Neovis.js 與 Neo4j 實作範例
下一篇
打打看 Neo4j Http Api 吧
系列文
圖形資料庫是什麼,可以吃嗎 - Neo4j30

尚未有邦友留言

立即登入留言