【问题标题】:How to extract Polygons from Multipolygons in Shapely?如何从 Shapely 中的多多边形中提取多边形?
【发布时间】:2016-08-13 07:07:16
【问题描述】:

我正在尝试从 Shapely 中的多面体中提取多边形。我可以使用来自 Shapely 的 MultiPolygon 将多边形列表转换为多面体。

>>> Multi = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('data.shp')]) 

还有,

>>> Multi.wkt
'MULTIPOLYGON (((249744.2315302934148349 142798.1643468967231456, 250113.7910872535139788 142132.9571443685272243, 250062.6213024436729029 141973.7622582934272941, 249607.7787708004761953 141757.7120557629095856, 249367.7742475979903247 142304.6840291862317827, 249367.7742475979903247 142304.6840291862317827, 249744.2315302934148349 142798.1643468967231456)), 
               ((249175.7899173096520826 142292.5352640640921891, 249367.7742475979903247 142304.6840291862317827, 249607.7787708004761953 141757.7120557629095856, 249014.4539607730694115 141876.1348429077770561, 249175.7899173096520826 142292.5352640640921891)))'

有谁知道我怎样才能扭转这个过程,即给定一个多面体,我怎样才能将它转换为单独的多边形?

【问题讨论】:

  • 你试过polygons = [polygon for polygon in Multi]吗?
  • 我尝试了您的解决方案,但出现此错误TypeError: string indices must be integers。你有想法吗?

标签: python shapely


【解决方案1】:

简单的做

Polygons = list(Multi)

这会提取多边形并将它们放在一个列表中。

【讨论】:

    【解决方案2】:

    根据集合上的documentation,包括MultiPointMultiLineStringMultiPolygon等类,它们的成员可以“通过geoms属性或使用@的迭代器协议访问987654326@或list()”:

    from shapely.geometry import MultiPolygon, Polygon
    
    multipolygon = MultiPolygon([Polygon([(0, 0), (1, 1), (1, 0)]),
                                 Polygon([(0, 0), (1, 1), (0, 1)])])
    
    polygons = list(multipolygon)
    print(*polygons)
    # POLYGON ((0 0, 1 1, 1 0, 0 0)) POLYGON ((0 0, 1 1, 0 1, 0 0))
    
    polygons = list(multipolygon.geoms)
    print(*polygons)
    # POLYGON ((0 0, 1 1, 1 0, 0 0)) POLYGON ((0 0, 1 1, 0 1, 0 0))
    
    for polygon in multipolygon:  # same for multipolygon.geoms
        print(polygon)
    # POLYGON ((0 0, 1 1, 1 0, 0 0))
    # POLYGON ((0 0, 1 1, 0 1, 0 0))
    

    您还可以通过索引提取单个几何图形:

    print(multipolygon[0])
    POLYGON ((0 0, 1 1, 1 0, 0 0))
    

    切片它们会给你一个集合:

    print(multipolygon[:1])
    MULTIPOLYGON (((0 0, 1 1, 1 0, 0 0)))
    

    【讨论】:

      【解决方案3】:

      为避免在使用this othwerwise great answer 时出现弃用警告,请执行以下操作:

      Polygons = list(Multipolygon.geoms)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 2014-03-16
        • 1970-01-01
        相关资源
        最近更新 更多