将多边形接近lat,在mysql中长
题
有人知道一种方法可以在距离某个点距离内的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,长期以来确实确实如此)是奇异性,因为当您接近电线杆时,网格“正方形”变得更窄。简单的方法是...不要将任何点靠近电线杆... :)
为所有多边形创建一个边界框,((可选地将这些结果存储在数据库中)将使复杂多边形的速度更快)。然后,您可以将每个多边形的边界框与所需尺寸的一个回合点进行比较。选择所有具有相交边界框的多边形。