在 MySQL 中获取接近 lat,long 的多边形

Posted

技术标签:

【中文标题】在 MySQL 中获取接近 lat,long 的多边形【英文标题】:Get polygons close to a lat,long in MySQL 【发布时间】:2010-12-26 12:21:12 【问题描述】:

有没有人知道一种方法来获取 mysql 数据库中的所有多边形在距一个点的给定距离内?实际距离并不那么重要,因为它是稍后为每个找到的多边形计算的,但是仅对“接近”的多边形进行该计算将是一个巨大的优化。

我查看了 MBR 并包含函数,但问题是一些多边形不包含在围绕该点绘制的边界框中,因为它们非常大,但它们的一些顶点仍然很接近。

有什么建议吗?

【问题讨论】:

【参考方案1】:

我认为这个问题没有单一的答案。这通常是一个问题,即如何组织数据,以便利用问题固有的空间局部性。

我脑海中浮现的第一个想法是使用网格,将每个点分配给一个正方形,然后检查选择该点所在的正方形及其周围的正方形。如果我们说的是无限网格,那么使用正方形的哈希值,这会给你比需要的更多的点(你有碰撞的地方),但仍然会减少一堆。当然,这并不立即适用于多边形,这只是一次头脑风暴。一种可能产生太多冲突的可能方法是将所有散列值 OR 在一起,并选择所有与该值进行 AND 的散列非零的条目(不确定这在 MySQL 中是否可行),您可能想要使用大虽然位数。

这种方法的问题是,假设我们谈论的是球坐标(通常是纬度,经度)是奇点,因为当您接近两极时,网格“正方形”会变窄。解决这个问题的简单方法是......不要将任何点靠近两极...... :)

【讨论】:

【参考方案2】:

一个慢版本(没有空间索引):

SELECT  *
FROM    mytable
WHERE   MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

要使用空间索引,您需要对表进行非规范化,以便每个多边形顶点都存储在自己的记录中。

然后在包含顶点坐标的字段上创建SPATIAL INDEX,然后发出以下查询:

SELECT  DISTINCT polygon_id
FROM    vertices
WHERE   MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

如果您在数据库中存储UTM 坐标而不是纬度和经度,事​​情会变得容易得多。

【讨论】:

非常感谢!对于那些有类似问题的人:我最终使用了围绕兴趣点绘制的圆的 MBR,并获取了 MBR 与圆 MBR 相交的所有多边形。 你能告诉我distance 是什么意思吗?是英里、公里还是米? @ShaishavJogani:@distance 是一个变量,用于保存您正在搜索的距离。它可以以英里、公里或米为单位,或任何其他距离单位,前提是您以相同的单位存储坐标。【参考方案3】:

为所有多边形创建一个边界框(可选地将这些结果存储在数据库中,这对于复杂的多边形来说会更快)。然后,您可以将每个多边形的边界框与所需大小的圆点进行比较。选择所有具有相交边界框的多边形。

【讨论】:

以上是关于在 MySQL 中获取接近 lat,long 的多边形的主要内容,如果未能解决你的问题,请参考以下文章

php mysql比较long和lat,返回10英里以下的

如何在 php 中获取当前位置 lat -long 值以便在 android 中使用

等到 GPS 启用,然后在 FusedLocationAPI 中获取 lat 和 long 值

无法在 iPhone 中使用 lat 和 long 获取地址

在 Android 中获取准确的 GEO 位置,例如 lat 和 long

每次我使用融合位置 api 获取 lat-long 时都会改变 Lat-long,即使我仍然在同一个位置