题
我有一个数据库进行地理编码的条目。我需要确定这两个项目是最远从一个子集的总的项目。例如,我选择一个列表中的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)
选择最大的两个距离。
显而易见的优化:打破世界中,N"方块"(例如,10度的经度、纬10度)和预算的巨大的圆圈之间的距离中心的每个配对。存储在数据库。现在你可以迅速寻找最远的"广场",只有检查(纬度、经度)对里面的那些瓷砖。
这里是 算法 实现PHP两点之间的距离的基础上纬度和经度。
请注意,如果"集的总项目"是大型的,你很快就会有相当多的计算做的事。如果是这种情况下,你可能想要考虑预算之间的距离城市对。
编辑:为什么10度优化不工作:
需要四个广场如下图所示
-------------------
| | |
| A | B |
| | |
|_______1|________|
| |2 |
| C | D |
| | |
|_______3|________|
只有通过测量中心广场和比较这些距离,你会得到一个和D进一步分开,比A和C。然而,城市1和3的进一步清楚地分开超过1和2。
不隶属于 StackOverflow