多边形交叉口寻找的优化

时间:2017-04-03 17:34:12

标签: python optimization computational-geometry

我有大约10亿个2D多边形,每个多边形有5到2000个顶点,放置在地理地图上。我想在四边形的有界范围内生成这些多边形的剪切蒙版,四边形是地图的正方形部分。我有一个天真编码的解决方案,它收集所有与四边形边界重叠的多边形,然后创建一个遮罩并绘制它发现的与四边形边界重叠的每个多边形。

相关代码:

def generate_alteration_layers_by_extent(alterations, poly_locators, extents, output_res=1000):
    left, right, upper, lower = extents
    query_rectangle = pysal.cg.shapes.Rectangle(left, lower, right, upper)
    num_layers = len(shapes_by_alterations)
    boxed_alteration_layers = []
    for i, (alteration, poly_locator) in enumerate(zip(alterations, poly_locators)):
        print "computing overlapping polygons"
        overlapping_polys = poly_locator.overlapping(query_rectangle)
        print "drawing polygons onto mask"
        img = Image.new('L', (output_res, output_res), 0)
        polys = [np.array(map(list, poly.vertices)) for poly in overlapping_polys]
        for poly in polys: 
            # normalize to the dimensions of img
            poly[:,0] -= left;  poly[:,0] *= (right-left); poly[:,0] *= output_res
            poly[:,1] -= lower; poly[:,1] *= (upper-lower); poly[:,1] *= output_res
            ImageDraw.Draw(img).polygon(poly, outline=1, fill=1)
        mask = np.array(img)
        boxed_alteration_layers.append(mask)
    return np.dstack(boxed_alteration_layers)

问题是这个计算花了太长时间 - 我已经在一台大内存机器上运行了一个掩模三个小时的程序,但它还没有完成。最昂贵的操作是计算重叠多边形。我认为代码可以通过查看较小的多边形域,排除搜索绝对不重叠的那些。 请注意,poly_locator变量是psyal.cg.locators.PolygonLocator s。任何意见,将不胜感激。我并不喜欢使用Python,并认为C ++可能具有我需要的功能。

1 个答案:

答案 0 :(得分:0)

我强烈推荐Lucanus Simonson的BOOST.polygon库。它处理各种多边形交互,计算复杂度惊人地降低。 Simonson的创新微积分可以减少二维问题的维数,这非常简洁;在他最初的提议的最后20分钟左右,我的下巴张开了。

相关问题