【问题标题】:How can I query for all records within latitude / longitude area?如何查询经纬度区域内的所有记录?
【发布时间】:2019-03-17 20:42:56
【问题描述】:

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

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

【问题讨论】:

标签: mysql latitude-longitude


【解决方案1】:

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)

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

【讨论】:

  • 不会处理反经络。 Prime和赤道很容易。你如何处理Anti?
  • 我不是为了覆盖其中一根电线杆。 :P
  • 我认为如果方框未在经度上对齐(想象一下纽约市周围的钻石),这将不起作用。通常,您需要使用投影,然后使用 point in polygon test
  • @TreyA:不,在你提到的情况下它不起作用,但 OP 只给了我们右上角和左下角的点,所以它很可能只是一个矩形。跨度>
  • 是的,我重读了上下角。当我看到由 lat/lon 描述的线性框时,我仍然感到紧张;)
【解决方案2】:

只需查找所有小于右边缘且大于左边缘的点,即小于下边缘且大于上边缘的点。

指向 4,4,右上角是 (5,5),左下角是 (3,3) - x 为 3

【讨论】:

  • 请解释你的反对意见,如果你不留下解释,它对任何人(包括我)都没有帮助。
猜你喜欢
  • 2012-06-12
  • 2022-08-21
  • 1970-01-01
  • 2015-04-05
  • 2012-05-12
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多