Faster way of polygon intersection with shapely

前端 未结 2 1915
时光取名叫无心
时光取名叫无心 2020-11-28 05:20

I have a large number of polygons (~100000) and try to find a smart way of calculating their intersecting area with a regular grid cells.

Currently, I am creating th

相关标签:
2条回答
  • 2020-11-28 05:32

    Since 2013/2014 Shapely has STRtree. I have used it and it seems to work well.

    Here is a snippet from the docstring:

    STRtree is an R-tree that is created using the Sort-Tile-Recursive algorithm. STRtree takes a sequence of geometry objects as initialization parameter. After initialization the query method can be used to make a spatial query over those objects.

    >>> from shapely.geometry import Polygon
    >>> from shapely.strtree import STRtree
    >>> polys = [Polygon(((0, 0), (1, 0), (1, 1))), Polygon(((0, 1), (0, 0), (1, 0))), Polygon(((100, 100), (101, 100), (101, 101)))]
    >>> s = STRtree(polys)
    >>> query_geom = Polygon([(-1, -1), (2, 0), (2, 2), (-1, 2)])
    >>> result = s.query(query_geom)
    >>> polys[0] in result
    True
    
    0 讨论(0)
  • 2020-11-28 05:37

    Consider using Rtree to help identify which grid cells that a polygon may intersect. This way, you can remove the for loop used with the array of lat/lons, which is probably the slow part.

    Structure your code something like this:

    from shapely.ops import cascaded_union
    from rtree import index
    idx = index.Index()
    
    # Populate R-tree index with bounds of grid cells
    for pos, cell in enumerate(grid_cells):
        # assuming cell is a shapely object
        idx.insert(pos, cell.bounds)
    
    # Loop through each Shapely polygon
    for poly in polygons:
        # Merge cells that have overlapping bounding boxes
        merged_cells = cascaded_union([grid_cells[pos] for pos in idx.intersection(poly.bounds)])
        # Now do actual intersection
        print(poly.intersection(merged_cells).area)
    
    0 讨论(0)
提交回复
热议问题