将多边形拆分或分解成 geopandas 或相关库中的段

split or explode polygon into segments in geopandas or related library

我正在尝试获取多边形的各个线段。我想单独处理每个段,例如获取长度、获取顶点等。

所以我有一个 pandas 地理数据框 gdf

我可以通过 gdf.geometry

访问多边形

以下将多边形作为线串访问

for polygon in gdf.geometry:
    boundary = polygon.boundary
    print(boundary)

加上 .length() 得到总长度。

知道如何拆分或分解每条线段吗?

  • 我了解到您正在寻找构成 Polygon 边界的 Point 作为 LineString 的系列多边形
  • 已使用比利时和英国作为示例多边形
  • 解决方案是围绕使用几何学迭代器
    • 对于 MultiPolygon 它是 geoms
    • 对于 exteriorLineArray 它是 coords
    • 对于成对的坐标使用zip()技术得到成对来改造一个两点LineString
import geopandas as gpd
import shapely.geometry

world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))

# pick a polygon and multipolygon to create line segments from
gdf = world.loc[world["iso_a3"].isin(["BEL", "GBR"])]


line_segs = gpd.GeoSeries(
    gdf["geometry"]
    .apply(
        lambda g: [g]
        if isinstance(g, shapely.geometry.Polygon)
        else [p for p in g.geoms]
    )
    .apply(
        lambda l: [
            shapely.geometry.LineString([c1, c2])
            for p in l
            for c1, c2 in zip(p.exterior.coords, list(p.exterior.coords)[1:])
        ]
    )
    .explode()
)

# visualise it's works...
line_segs.plot()
# output for SO
print(line_segs.to_frame().head(10).to_markdown())

示例输出数据

geometry
129 LINESTRING (6.15665815595878 50.80372101501058, 6.043073357781111 50.12805166279423)
129 LINESTRING (6.043073357781111 50.12805166279423, 5.782417433300907 50.09032786722122)
129 LINESTRING (5.782417433300907 50.09032786722122, 5.674051954784829 49.5294835475575)
129 LINESTRING (5.674051954784829 49.5294835475575, 4.799221632515724 49.98537303323637)
129 LINESTRING (4.799221632515724 49.98537303323637, 4.286022983425084 49.90749664977255)
129 LINESTRING (4.286022983425084 49.90749664977255, 3.588184441755658 50.37899241800356)
129 LINESTRING (3.588184441755658 50.37899241800356, 3.123251580425688 50.78036326761455)
129 LINESTRING (3.123251580425688 50.78036326761455, 2.658422071960274 50.79684804951575)
129 LINESTRING (2.658422071960274 50.79684804951575, 2.513573032246143 51.14850617126183)
129 LINESTRING (2.513573032246143 51.14850617126183, 3.314971144228537 51.34578095153609)

可视化

将多边形属性加入线段

  • GeoSeriesGeoDataFrame 上的索引相同
  • 因此简单连接允许将多边形的属性连接到线段
line_segs.to_frame().join(gdf.drop(columns="geometry"))