我有一个地理编码条目数据库。我需要确定哪两个条目距离总条目的子集最远。例如,我选择一个包含10个条目的列表,然后从该列表中确定哪个两个位置代表该列表中的最大距离。
我无法理解如何处理这个问题。我甚至考虑过使用弧度,但似乎没有任何东西符合要求。
仅供参考,LAMP堆栈在这里......
答案 0 :(得分:2)
以下查询将计算所有点之间的距离,并返回距离最大的两个点:
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)
从它的外观来看,这可以通过首先找到点的convex hull来解决(例如,使用Graham's scan),然后对其进行直径rotating calipers
答案 2 :(得分:1)
蛮力方法:
通过平均纬度和经度值来查找十个列表的中心。
对于数据库中的每个(纬度,经度)对,使用大圆公式计算距离步骤(1)中心的距离
选择最长的两个距离。
明显的优化:将世界分成N个“正方形”(例如,10度经度,10度纬度)并预先计算每个配对的中心之间的大圆距离。将其存储在数据库中。现在你可以快速寻找最远的“正方形”,只检查那些瓷砖内的(纬度,经度)对。
答案 3 :(得分:0)
以下是the algorithm在PHP中实现的基于纬度和经度的两点之间的距离。
请注意,如果“总条目的子集”很大,您很快就会有很多计算要做。如果是这种情况,您可能需要考虑预先计算城市对之间的距离。
编辑:为什么10度优化不起作用:
如下所示取四个方格
-------------------
| | |
| A | B |
| | |
|_______1|________|
| |2 |
| C | D |
| | |
|_______3|________|
通过仅测量正方形的中心并比较这些距离,得到A和D比A和C更远。但是,城市1和3明显比1和2更远。