我希望创建一个 MySQL 查询来查找世界上指定区域内的所有记录。每条记录都包含一个点 (lat/lon),我有指定区域的右上角 (lat/lon) 和左下角 (lat/lon)。

有了这些信息,我如何才能找到合适的记录?

最佳答案

LAT1 = MIN(右上角纬度,左下纬度)

LAT2 = MAX(右上角纬度,左下纬度)

LON1 = MIN(右上角 lon,左下角 lon)

LON2 = MAX(右上角 lon,左下角 lon)

SELECT fields
FROM points
WHERE lat BETWEEN LAT1 AND LAT2
AND lon BETWEEN LON1 AND LON2

这样,如果您的盒子穿过本初子午线或赤道,查询应该会处理。

要处理第 180 条子午线(或反子午线),您需要将右经线与左经线进行比较,检查右侧数是否为负数,左侧数是否为正数。如果是这样,那么您已经越过了第 180 条子午线。您的查询必须如下所示:
SELECT fields
FROM points
WHERE lat BETWEEN LAT1 AND LAT2
AND (lon BETWEEN -180 AND LON1 OR lon BETWEEN LON2 AND 180)

不过,我宁愿不考虑如何处理位于地球顶部或底部的一个真正两极上的盒子。 =)

关于mysql - 如何查询纬度/经度区域内的所有记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7920565/

10-12 13:28