优化多边形搜索

时间:2018-10-03 14:37:08

标签: python r algorithm polygon

我将世界分割成X个随机多边形。

enter image description here

然后给我一个坐标C1,例如(-21.45,7.10),我想将正确的多边形归于该坐标。

第一个解决方案是在每个多边形上应用我的'point_in_polygon'算法(给定一组定义多边形的坐标和一个定义点的坐标,告诉我该点是否在内部),直到我找到合适的。 但是,如果要在很多多边形中放置很多点,那将非常昂贵。

对此的改进依赖于以下思想: 为了优化搜索,我创建了一个带有步骤 n,k grid(一个集合),其中我已经将每对坐标赋予如下属性:

for i=-180 to 180 step n 
    for j = -90 to 90 step k
        grid.add(i,j)

然后我创建一个字典,并为集合中的每一对找到对应的多边形

For each g in grid
    For each p in polygons
        If point_in_polygon(g,p) == True
            my_dict(g) = p

然后,当我收到C1时,我会在网格中寻找最接近的坐标,比如说g1。 多亏了my_dict,我可以快速p1 = my_dict(g1) 然后,我计算出point_in_polygon(C1, p1)可能是正确的。如果不是,则找到分配给另一个多边形的最接近的g,然后重做测试。直到找到正确的多边形。

现在,问题是: 创建网格的最优n,k是多少?

这样我就可以以最少的步骤找到正确的多边形。 我不希望它太低,因为搜索分配给另一个多边形的最接近的g可能会很昂贵。 我也不希望它太高,因为那样的话我可能会缺少一些多边形,然后搜索就不会收敛。

我的直觉是最小的多边形将给出步骤。

我不确定这是编程问题,数学问题还是凭经验可以找到的东西,这就是我在这里问的原因。

任何输入表示赞赏!

2 个答案:

答案 0 :(得分:1)

让我建议对您的网格进行一些修改。当前,您为每个单元格存储单元格中心所属的多边形。而是存储与单元格重叠的所有多边形。然后,每当看到一个单元只有一个重叠的多边形时,就不需要进行任何包含测试。可以使用保守的rasterization方法来构建网格(请注意,所引用的文章不是针对保守的而是针对常规的栅格化)。

网格的效率与单多边形单元格与总单元格的比率相关(因为这是不必执行多边形包含测试的可能性)。存储本身很便宜。您可以使用密集数组并不断访问单元格。因此,从理论上讲,您应该拥有尽可能多的像元(因为随着您拥有更多的像元,单多边形像元的比例会增加)。在实践中,您可能会发现缓存和其他内存影响可能会使大型网格变得不切实际。但是,除了测试之外,没有其他好方法。因此,只需在几台不同的机器上尝试几种尺寸,然后尝试找到合适的尺寸即可。

如果我不得不猜测,我会说您的单元格应该是正方形的,并且其面积应约为平均多边形面积的1%-5%。而且,与许多长而细的多边形相比,更紧凑的多边形可以更有效地处理。

答案 1 :(得分:1)

选择任意一点,然后从该点开始向下直线画一条线。您点击的第一个多边形边缘会告诉您该点位于哪个多边形中。

因此,如果您不想进行多边形测试,则无需将空间划分为规则的网格,而是先将其切成具有垂直切线的条带,并贯穿所有多边形相交点。

现在,在每个条带中,没有任何多边形的边缘交叉或末端,因此您可以从下到上列出所有这些边缘的有序列表。

如果要查找包含点的多边形,请使用x坐标进行二进制搜索以找到合适的条带。然后,在横跨该条带的边缘列表中,可以使用y坐标进行二进制搜索,以找到该点下方最接近的那个,然后告诉您该点位于哪个多边形中。

Google“梯形分解”以查找有关类似技术的大量信息。