Neo4j:找到两个纬度/经度之间的中间点
昨天我寫了一篇博客文章,展示了如何使用Cypher查找兩個(gè)緯度/經(jīng)度之間的中點(diǎn),這是第一次嘗試填補(bǔ)丟失位置的方法,但我意識(shí)到我可以做得更好。
正如我在上一篇文章中提到的,當(dāng)我找到一個(gè)缺少經(jīng)緯度坐標(biāo)的停靠點(diǎn)時(shí),通常可以在附近找到兩個(gè)停靠點(diǎn),以便對(duì)該停靠點(diǎn)的位置進(jìn)行三角剖分。
我也有火車路線,該路線指示從一個(gè)停靠點(diǎn)到另一個(gè)停靠點(diǎn)所花費(fèi)的秒數(shù),這使我可以指示出無位置停靠點(diǎn)是否比另一個(gè)停靠點(diǎn)更靠近一個(gè)停靠點(diǎn)。
例如,考慮在b沒有位置的情況下停靠a,b和c。 如果停靠點(diǎn)之間有以下距離:
(a)-[:NEXT {time: 60}]->(b)-[:NEXT {time: 240}]->(c)它告訴我們,點(diǎn)“ b”實(shí)際上是從“ a”到“ c”的距離的0.2,而不是中點(diǎn)。
有一個(gè)公式可以用來說明這一點(diǎn):
a = sin((1?f)?δ) / sin δ b = sin(f?δ) / sin δ x = a ? cos φ1 ? cos λ1 + b ? cos φ2 ? cos λ2 y = a ? cos φ1 ? sin λ1 + b ? cos φ2 ? sin λ2 z = a ? sin φ1 + b ? sin φ2 φi = atan2(z, √x2 + y2) λi = atan2(y, x)δ is the angular distance d/R between the two points. φ = latitude λ = longitude翻譯成Cypher(帶有強(qiáng)制性的希臘符號(hào))后,它看起來像這樣,以找到從一個(gè)點(diǎn)到另一個(gè)點(diǎn)的方式的點(diǎn)0.2
with {latitude: 51.4931963543, longitude: -0.0475185810} AS p1, {latitude: 51.47908, longitude: -0.05393950 } AS p2WITH p1, p2, distance(point(p1), point(p2)) / 6371000 AS δ, 0.2 AS f WITH p1, p2, δ, sin((1-f) * δ) / sin(δ) AS a,sin(f * δ) / sin(δ) AS b WITH radians(p1.latitude) AS φ1, radians(p1.longitude) AS λ1,radians(p2.latitude) AS φ2, radians(p2.longitude) AS λ2,a, b WITH a * cos(φ1) * cos(λ1) + b * cos(φ2) * cos(λ2) AS x,a * cos(φ1) * sin(λ1) + b * cos(φ2) * sin(λ2) AS y,a * sin(φ1) + b * sin(φ2) AS z RETURN degrees(atan2(z, sqrt(x^2 + y^2))) AS φi,degrees(atan2(y,x)) AS λi╒═════════════════╤════════════════════╕ │φi │λi │ ╞═════════════════╪════════════════════╡ │51.49037311149128│-0.04880308288561931│ └─────────────────┴────────────────────┘一個(gè)快速的健全性檢查,插入0.5而不是0.2可以找到我能夠根據(jù)昨天的帖子進(jìn)行健全性檢查的中點(diǎn):
╒═════════════════╤═════════════════════╕ │φi │λi │ ╞═════════════════╪═════════════════════╡ │51.48613822097523│-0.050729537454086385│ └─────────────────┴─────────────────────┘目前為止就這樣了!
翻譯自: https://www.javacodegeeks.com/2016/11/neo4j-find-intermediate-point-two-latlongs.html
總結(jié)
以上是生活随笔為你收集整理的Neo4j:找到两个纬度/经度之间的中间点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么设置电信宽带账号密码忘了怎么办啊
- 下一篇: 架构层和建模域逻辑