我有一个数据库进行地理编码的条目。我需要确定这两个项目是最远从一个子集的总的项目。例如,我选择一个列表中的10项,然后,从这一名单,确定这两个地方表示的最大距离,在这一名单。

我不能理解如何处理这个。我已经考虑过使用弧度甚至,但似乎什么都没有满足的要求。

仅供参考,灯栈去这里...

有帮助吗?

解决方案

下面的查询将计算距离你所有的点和返回的两个最大的距离:

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

我现在建议做这些计算手之前和储存的结果在一个单独的表格。

其他提示

它的外观,这可能是解决第一个找到的 要点(利用 格雷厄姆的扫描, 例如),然后在做 旋钳 为径。

暴力的方法:

  1. 找到你的十个平均值的纬度和经度值。

  2. 每个(纬度、经度)对在你的数据库,使用的公式来计算距离,从本中心从步骤(1)

  3. 选择最大的两个距离。

显而易见的优化:打破世界中,N"方块"(例如,10度的经度、纬10度)和预算的巨大的圆圈之间的距离中心的每个配对。存储在数据库。现在你可以迅速寻找最远的"广场",只有检查(纬度、经度)对里面的那些瓷砖。

这里是 算法 实现PHP两点之间的距离的基础上纬度和经度。

请注意,如果"集的总项目"是大型的,你很快就会有相当多的计算做的事。如果是这种情况下,你可能想要考虑预算之间的距离城市对。

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

需要四个广场如下图所示

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

只有通过测量中心广场和比较这些距离,你会得到一个和D进一步分开,比A和C。然而,城市1和3的进一步清楚地分开超过1和2。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top