Neo4j:找到两个纬度/经度之间的中间点

昨天我写了一篇博客文章,展示了如何使用Cypher查找两个纬度/经度之间的中点,这是第一次尝试填补丢失位置的方法,但我意识到我可以做得更好。

正如我在上一篇文章中提到的,当我找到一个缺少经纬度坐标的停靠点时,通常可以在附近找到两个停靠点,以便对该停靠点的位置进行三角剖分。

我也有火车路线,该路线指示从一个停靠点到另一个停靠点所花费的秒数,这使我可以指示出无位置停靠点是否比另一个停靠点更靠近一个停靠点。

例如,考虑在b没有位置的情况下停靠a,b和c。 如果停靠点之间有以下距离:

(a)-[:NEXT {time: 60}]->(b)-[:NEXT {time: 240}]->(c)

它告诉我们,点“ b”实际上是从“ a”到“ c”的距离的0.2,而不是中点。

一个公式可以用来说明这一点:

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, √x² + y²)
λi = atan2(y, x)
 
δ is the angular distance d/R between the two points.
φ = latitude
λ = longitude

翻译成Cypher(带有强制性的希腊符号)后,它看起来像这样,以找到从一个点到另一个点的方式的点0.2

with {latitude: 51.4931963543, longitude: -0.0475185810} AS p1, 
     {latitude: 51.47908, longitude: -0.05393950 } AS p2
 
WITH 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│
└─────────────────┴────────────────────┘

一个快速的健全性检查,插入0.5而不是0.2可以找到我能够根据昨天的帖子进行健全性检查的中点:

╒═════════════════╤═════════════════════╕
│φi               │λi                   │
╞═════════════════╪═════════════════════╡
│51.48613822097523│-0.050729537454086385│
└─────────────────┴─────────────────────┘

目前为止就这样了!

翻译自: https://www.javacodegeeks.com/2016/11/neo4j-find-intermediate-point-two-latlongs.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值