将多边形拆分或分解成 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
- 对于 exterior 是 LineArray 它是 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)
可视化
将多边形属性加入线段
- GeoSeries 和 GeoDataFrame 上的索引相同
- 因此简单连接允许将多边形的属性连接到线段
line_segs.to_frame().join(gdf.drop(columns="geometry"))
我正在尝试获取多边形的各个线段。我想单独处理每个段,例如获取长度、获取顶点等。
所以我有一个 pandas 地理数据框 gdf
我可以通过 gdf.geometry
访问多边形以下将多边形作为线串访问
for polygon in gdf.geometry:
boundary = polygon.boundary
print(boundary)
加上 .length()
得到总长度。
知道如何拆分或分解每条线段吗?
- 我了解到您正在寻找构成 Polygon 边界的 Point 作为 LineString 的系列 或 多边形
- 已使用比利时和英国作为示例多边形
- 解决方案是围绕使用几何学迭代器
- 对于 MultiPolygon 它是 geoms
- 对于 exterior 是 LineArray 它是 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) |
可视化
将多边形属性加入线段
- GeoSeries 和 GeoDataFrame 上的索引相同
- 因此简单连接允许将多边形的属性连接到线段
line_segs.to_frame().join(gdf.drop(columns="geometry"))