如何利用经纬度计算城市节点间距离?替代权重查询方案咨询
经纬度计算城市间距离的实现方案
要不要预先添加距离关系?
不需要预先创建类似:Road的距离关系,直接通过经纬度实时计算更灵活:
- 首都城市数量有限,实时计算的性能完全够用,无需维护额外的关系数据。
- 若后续需更新城市经纬度,不用同步更新对应的距离关系,减少维护成本。
- 仅当你需要频繁重复计算相同城市对的距离时,可考虑预先计算并存储关系来提升查询效率,但这属于优化项,非必需。
等效查询实现
根据需求,分两种场景给出对应查询:
场景1:直接计算两点间的直线球面距离
如果只需要Zagreb到Paris的直接公里距离,无需路径中转,使用以下查询:
MATCH (start:City {name: "Zagreb"}), (end:City {name: "Paris"}) WITH start, end, 6371 * 2 * ASIN(SQRT( SIN(RADIANS((end.latitude - start.latitude)/2))^2 + COS(RADIANS(start.latitude)) * COS(RADIANS(end.latitude)) * SIN(RADIANS((end.longitude - start.longitude)/2))^2 )) AS direct_distance RETURN [start, end] AS cities, direct_distance AS total_weight;
注:公式中6371是地球平均半径(公里),计算结果为两点间的球面直线距离。
场景2:找经过其他城市的中转最短路径总距离
如果需要模拟类似道路路径的中转规划(任意城市间可作为路径节点),使用动态计算相邻城市距离作为权重的最短路径查询:
MATCH p = (:City {name: "Zagreb"}) -[:* wShortest (a, b | 6371 * 2 * ASIN(SQRT( SIN(RADIANS((b.latitude - a.latitude)/2))^2 + COS(RADIANS(a.latitude)) * COS(RADIANS(b.latitude)) * SIN(RADIANS((b.longitude - a.longitude)/2))^2 )) ) total_weight]-> (:City {name: "Paris"}) RETURN nodes(p) AS cities, total_weight;
这里用:*匹配任意长度的城市节点序列,在wShortest的权重函数中实时计算相邻两个城市的球面距离,最终返回总距离最小的路径。
内容的提问来源于stack exchange,提问作者NoLANman
相关产品推荐
相关产品推荐

