如何使用Python将封闭多段线polylines转换为多边形polygons
解决方法
你可以通过Shapely和geopandas两个Python空间计算库实现需求,核心操作逻辑如下:
- 第一步:将所有多段线转为Shapely的
LineString对象,合并为MultiLineString集合后调用unary_union方法,拆分所有相交线段,得到所有在交点处被切断的独立线段。 - 第二步:使用拆分后的线段构建平面拓扑,直接调用
shapely.ops.polygonize方法即可自动识别所有封闭区域,输出为Polygon对象列表。 - 第三步:如果需要获取指定多边形对应的原始多段线顶点,可遍历生成的
Polygon的exterior.coords属性获取外边界坐标,interiors属性获取内洞坐标,再和原始多段线顶点做匹配即可。
以下是可直接运行的最简示例代码:
from shapely.geometry import LineString, MultiLineString from shapely.ops import unary_union, polygonize # 替换为你自己的多段线坐标列表 raw_polylines = [ [(0,0), (2,0), (2,2), (0,2)], [(1,0), (1,3)], [(0,1), (3,1)] ] # 转Shapely LineString对象 line_objs = [LineString(p) for p in raw_polylines] # 打断所有相交线段 merged_lines = unary_union(MultiLineString(line_objs)) # 提取所有封闭区域为多边形 polygons = list(polygonize(merged_lines)) # 输出每个多边形的顶点坐标 for idx, poly in enumerate(polygons): print(f"多边形{idx}外边界顶点:", list(poly.exterior.coords))
如果你的多段线存在自相交、悬挂线段等问题,提前用
shapely.is_valid做合法性校验,过滤无效线段后再做面提取,可避免出现异常结果。
内容的提问来源于stack exchange,提问作者Markus1991
相关产品推荐
相关产品推荐

