在多个多边形中搜索点的最佳方法
Posted
技术标签:
【中文标题】在多个多边形中搜索点的最佳方法【英文标题】:Best way to search a point across several polygons 【发布时间】:2012-06-22 09:11:18 【问题描述】:我需要将给定点(纬度、经度)与多个多边形进行匹配,以确定是否匹配。
最简单的方法是遍历每个多边形并应用多边形中的点检查算法,但这非常昂贵。
我所做的下一个优化是为每个多边形(上限、下限)定义一个边界矩形,并针对每个边界框迭代检查该点(与检查多边形中的所有点相比,比较少)。
还有其他可能的优化吗?绑定矩形点上的空间索引或 geohash 有帮助吗?
【问题讨论】:
【参考方案1】:进一步优化:
边界框的想法很好。检查一个点是否在边界框中非常快。
如果你还需要更快的速度,你可以像这样做更多的预计算:
-
为每个 polgon 创建一个边界框。
定义覆盖地图的大小相同的“图块”。
为每个图块创建一个重叠的多边形列表。您可以通过首先检查边界框是否与图块重叠来做到这一点。如果有,请检查多边形是否与图块重叠。
搜索时,这样做:
-
确定您所在的磁贴。这是一个快速的操作。
现在您有了潜在多边形列表。
对于每个多边形,检查点是否在边界框中。
如果是,请使用您提到的更昂贵的算法检查该点是否在多边形中。
我已经多次使用过这个算法,而且速度非常快。通过更改图块大小,您可以在内存占用和性能之间选择适当的平衡点:
想想极端情况:
一个覆盖整个地图的巨大图块: 您将获得地图中所有元素的列表,您必须检查所有边界框。
非常小的图块(1x1 米的地图,每个国家只有一个多边形): 你会得到大量的瓷砖。所有的多边形将被分割成许多块,每个块只有一个多边形。但是,一旦您(快速)确定了该点在哪个图块中,几乎可以 100% 确定只有一个多边形需要检查。
您需要介于两者之间。如果您只是偶尔需要它,您可能希望选择低内存占用而不是性能。最佳切片大小还取决于多边形大小的同质性。因此,没有自动的方法可以计算出最佳的 tile-size,您只需稍作调整,直到正确为止。
【讨论】:
以上是关于在多个多边形中搜索点的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章