如何优化几何操作的性能

时间:2015-04-24 04:37:15

标签: python computational-geometry shapely

我正在寻找一种优化几何操作性能的方法。我的目标是计算一系列多边形(21,562)中的多少分(205,779)。使用python和R以及GIS软件(如ArcGIS,QGIS)更受欢迎。

以下是我搜索和编写的解决方案。

  1. 使用ArcGIS:其中一个示例位于http://support.esri.com/cn/knowledgebase/techarticles/detail/30779 - >虽然我没有尝试过,但根据我之前的经验,它总是需要大量的空间连接时间。

  2. 使用GDAL,OGR:以下是一个示例:http://geoexamples.blogspot.tw/2012/06/density-maps-using-gdalogr-python.html - >每个多边形需要5到9秒。

  3. 使用带有循环的Shapely准备几何操作:这是我的示例,每个多边形需要2.7到3.0秒。 (注意,点是列表中的Point对象)

    prep_poly=[]
    for i in polygons:
        mycount=[]
        for j in points:
            if prep(i).contains(j):
                mycount.append(1) #count how many points within polygons
        prep_poly.append(sum(mycount)) #sum once for every polygon
        mycount=[]
    
  4. 使用带滤镜的Shapely准备几何操作:这是我的示例,每个多边形大约需要3.3到3.9秒。(注意,点是MultiPoint对象)

    prep_poly=[]
    for i in polygons:
        prep_poly.append(len(filter(prep(i).contains, point1)))
    
  5. 尽管准备好的几何操作确实提高了性能,但处理大量多边形仍然很耗时。有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作(Python代码),而不是浏览每个矩形的屏幕上的每个像素:

first_pixel = any pixel in the polygon
px_list = [] # array with pixels left to check
px_list.append(first_pixel) # add pixel to list of pixels to process

count = 0

while len(array) > 0: # pixels left in pixel list
    curr_pixel = array[0]
    for pixel in get_adjacent_pixels(curr_pixel): # find adjacent pixels
                                                  # ie (vertical, horizontal, diagonal)
        if pixel in shape:
            px_list.append(pixel) # add pixel to list

    px_list.remove(curr_pixel)
    count += 1

基本上,与路径查找的工作方式相同。查看此Wiki文章,以获得上述算法的直观表示: http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Algorithm

如果您没有简单的方法来查找起点,您可以遍历所有点一次,检查每个点是否包含在形状中,然后将该点与形状一起存储在单独的列表中并删除它来自原始的形状 - 我们有没有点 - 但是列表。