有人知道一种方法可以在距离某个点距离内的MySQL DB中获取所有多边形吗?实际距离并不重要,因为它是针对每个发现的多边形进行计算的,但是仅对“关闭”的多边形进行计算是一个巨大的优化。

我看了MBR并包含功能,但问题是,某些多边形不包含在该点附近绘制的边界框中,因为它们很大,但是它们的某些顶点仍然很近。

有什么建议么?

有帮助吗?

解决方案

慢版本(无空间索引):

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 在您的数据库中进行协调,而不是纬度和经度。

其他提示

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

弹出我脑海的第一个想法是使用网格,将每个点分配到一个正方形,然后选中“正方形”,以及周围的那些。如果我们要谈论无限的网格,然后使用广场的哈希值,这将为您带来比所需的更多点(您有碰撞的地方),但仍会减少一堆数量。当然,这不适用于多边形,这只是头脑风暴。一种可能产生过多碰撞的可能方法是将或所有哈希值一起选择,然后选择具有该值的哈希及其的所有条目是非零的(不确定在mysql中是否可以使用),您可能需要使用大型虽然有数量。

这种方法的问题是,假设我们正在谈论球形坐标(LAT,长期以来确实确实如此)是奇异性,因为当您接近电线杆时,网格“正方形”变得更窄。简单的方法是...不要将任何点靠近电线杆... :)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top