在MySQL中获取接近纬度的多边形

时间:2009-12-14 17:27:44

标签: mysql polygon distance point

有没有人知道如何在一个点的给定距离内获取MySQL数据库中的所有多边形?实际距离并不重要,因为它是为以后找到的每个多边形计算的,但对于“接近”的多边形进行计算将是一个巨大的优化。

我看过MBR并且包含函数,但问题是一些多边形不包含在点周围绘制的边界框内,因为它们非常大,但它们的一些顶点仍然很接近。 p>

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

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

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坐标而不是纬度和经度,那么事情会更容易。

答案 1 :(得分:1)

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

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

这种方法的问题是,假设我们所说的球面坐标(纬度,长度一般都是)是奇点,因为当你接近极点时,网格“正方形”变得越来越窄。对此的简单方法是......不要将任何点靠近极点......:)

答案 2 :(得分:0)

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