在 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 中获取当前位置 lat -long 值以便在 android 中使用
等到 GPS 启用,然后在 FusedLocationAPI 中获取 lat 和 long 值
无法在 iPhone 中使用 lat 和 long 获取地址