列表中纬度/经度之间的最长距离

Posted

技术标签:

【中文标题】列表中纬度/经度之间的最长距离【英文标题】:Longest Distance Between Lat/Longs in a List 【发布时间】:2010-11-19 23:03:09 【问题描述】:

我有一个地理编码条目数据库。我需要确定哪两个条目与总条目的子集相距最远。例如,我选择一个包含 10 个条目的列表,然后从该列表中确定哪两个位置代表该列表中的最大距离。

我无法思考如何解决这个问题。我什至考虑过使用弧度,但似乎没有任何东西符合要求。

仅供参考,LAMP 堆栈正在这里...

【问题讨论】:

【参考方案1】:

以下查询将计算所有点之间的距离并返回距离最大的两个:

SELECT coor1.longitude as lon1,
       coor1.latitude as lat1,
       coor2.longitude as lon2,
       coor2.latitude as lat2,
       (ACOS(
         COS(RADIANS(coor1.latitude))  * 
         COS(RADIANS(coor1.longitude)) *
         COS(RADIANS(coor2.latitude))  *
         COS(RADIANS(coor2.longitude)) + 
         COS(RADIANS(coor1.latitude))  *
         SIN(RADIANS(coor1.longitude)) *
         COS(RADIANS(coor2.latitude))  *
         SIN(RADIANS(coor2.longitude)) +
         SIN(RADIANS(coor1.latitude))  * 
         SIN(RADIANS(coor2.latitude))
         ) * 6378                        --- Use 3963.1 for miles
       ) 
AS DistanceKM
FROM coordinates coor1,
     coordinates coor2
WHERE NOT (coor1.longitude = coor2.longitude AND coor1.latitude = coor2.latitude)
ORDER BY DistanceKM DESC
LIMIT 1;                                 --- Only the biggest

现在我建议事先进行这些计算并将结果存储在单独的表中。

【讨论】:

这将每次重新计算答案。这可能是坏事,也可能不是坏事,具体取决于数据集的大小和请求答案的频率。此外,在大型系统上,将 CPU 密集型计算放在数据库上并不是一个好的设计选择(通常最好将其放在应用程序服务器上)。对于中小型网站,这是一个非常好的选择。 就像我说的,我建议事先进行这些计算并将结果存储在单独的表中。我发布了该查询以供参考。 这看起来很有希望,非常感谢。用例是人们可以创建临时的条目列表,然后我需要根据距离的大小为(列表)分配一种点值。【参考方案2】:

从表面上看,这可以通过首先找到点的convex hull(例如使用Graham's scan),然后对其直径进行rotating calipers 来解决。

【讨论】:

如果点在一个平面上,它就可以工作。你如何为一个球体做到这一点? 我相信只要所有点都在大圆的同一侧(即球体的同一半),它就可以工作,尽管这只是一种预感,所以不要持有我去吧。【参考方案3】:

蛮力方法:

    通过平均纬度和经度值找到十个列表的中心。

    对于数据库中的每个(纬度、经度)对,使用大圆公式计算从步骤 (1) 到中心的距离

    选择最大的两个距离。

明显的优化:将世界分成 N 个“正方形”(例如,经度 10 度,纬度 10 度)并预先计算每个配对中心之间的大圆距离。将其存储在数据库中。现在您可以快速查找最远的“正方形”,并且只检查这些图块内的(纬度、经度)对。

【讨论】:

@Derobert:优化不起作用。由于我需要格式化文本以获得更好的解释,请参阅我的答案的底部。 @Eric J:这是一个很好的观点。但我认为你可以通过检查一些额外的方格来绕过它(但仍然比所有方格都少很多)。【参考方案4】:

这里是the algorithm在php中实现的基于经纬度的两点之间的距离。

请注意,如果“总条目的子集”很大,您很快就会有很多计算要做。如果是这种情况,您可能需要考虑预先计算城市对之间的距离。

编辑:为什么 10 度优化不起作用:

如下图取四个方格

-------------------
|        |        |
|   A    |   B    |
|        |        |
|_______1|________|
|        |2       |
|   C    |   D    |
|        |        |
|_______3|________|

通过仅测量正方形的中心并比较这些距离,您会得到 A 和 D 比 A 和 C 相距更远。但是,城市 1 和 3 显然比 1 和 2 相距更远。

【讨论】:

以上是关于列表中纬度/经度之间的最长距离的主要内容,如果未能解决你的问题,请参考以下文章

基于纬度/经度的点列表之间的距离

如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?

怎么知道经纬度算距离,

用于查找使用纬度和经度之间的距离的Sql返回错误的距离

两个纬度/经度表之间的距离计算

查找两个经度纬度之间的距离-Mysql