在多个多边形中搜索点的最佳方法

Posted

技术标签:

【中文标题】在多个多边形中搜索点的最佳方法【英文标题】:Best way to search a point across several polygons 【发布时间】:2012-06-22 09:11:18 【问题描述】:

我需要将给定点(纬度、经度)与多个多边形进行匹配,以确定是否匹配。

最简单的方法是遍历每个多边形并应用多边形中的点检查算法,但这非常昂贵。

我所做的下一个优化是为每个多边形(上限、下限)定义一个边界矩形,并针对每个边界框迭代检查该点(与检查多边形中的所有点相比,比较少)。

还有其他可能的优化吗?绑定矩形点上的空间索引或 geohash 有帮助吗?

【问题讨论】:

【参考方案1】:

进一步优化:

边界框的想法很好。检查一个点是否在边界框中非常快。

如果你还需要更快的速度,你可以像这样做更多的预计算:

    为每个 polgon 创建一个边界框。 定义覆盖地图的大小相同的“图块”。 为每个图块创建一个重叠的多边形列表。您可以通过首先检查边界框是否与图块重叠来做到这一点。如果有,请检查多边形是否与图块重叠。

搜索时,这样做:

    确定您所在的磁贴。这是一个快速的操作。 现在您有了潜在多边形列表。 对于每个多边形,检查点是否在边界框中。 如果是,请使用您提到的更昂贵的算法检查该点是否在多边形中。

我已经多次使用过这个算法,而且速度非常快。通过更改图块大小,您可以在内存占用和性能之间选择适当的平衡点:

想想极端情况:

一个覆盖整个地图的巨大图块: 您将获得地图中所有元素的列表,您必须检查所有边界框。

非常小的图块(1x1 米的地图,每个国家只有一个多边形): 你会得到大量的瓷砖。所有的多边形将被分割成许多块,每个块只有一个多边形。但是,一旦您(快速)确定了该点在哪个图块中,几乎可以 100% 确定只有一个多边形需要检查。

您需要介于两者之间。如果您只是偶尔需要它,您可能希望选择低内存占用而不是性能。最佳切片大小还取决于多边形大小的同质性。因此,没有自动的方法可以计算出最佳的 tile-size,您只需稍作调整,直到正确为止。

【讨论】:

以上是关于在多个多边形中搜索点的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL在多个地方多次绘制同一个多边形

搜索任意多边形区域的坐标绑定数据数据库

用turf.js求多个点的外包多边形

用turf.js求多个点的外包多边形

根据种子点识别多边形边界的最佳方法是啥?

基于周界点的多边形 - oracle 空间