如何用Python脚本将MultiPolygon平滑合并为单个Polygon?
用Shapely合并MultiPolygon为单个Polygon的脚本
首先明确你的数据结构:你给出的MultiPolygon是扁平的坐标列表,其中每一组连续坐标点构成一个独立多边形(示例里每3个点对应一个三角形)。我们需要先拆分这个扁平列表,再用Shapely完成合并。
步骤1:安装Shapely
还没安装的话先执行:
pip install shapely
步骤2:完整脚本
from shapely.geometry import Polygon, MultiPolygon from shapely.ops import unary_union def flatten_multipolygon_to_single_polygon(flat_coords, polygon_point_count=3): # 1. 把扁平坐标拆分成单个多边形的坐标集合 polygons = [] for i in range(0, len(flat_coords), polygon_point_count): poly_coords = flat_coords[i:i+polygon_point_count] # 确保多边形坐标闭合(Shapely要求首尾点一致) if poly_coords[0] != poly_coords[-1]: poly_coords.append(poly_coords[0]) polygons.append(Polygon(poly_coords)) # 2. 创建Shapely的MultiPolygon对象 multi_poly = MultiPolygon(polygons) # 3. 合并为单个Polygon:两种方式任选其一 # 方式A:取所有多边形的凸包(简单粗暴,覆盖范围更大,符合你需求) merged_poly = multi_poly.convex_hull # 方式B:合并并集(更精准,但若多边形分离会返回MultiPolygon,需转成单个) # merged_poly = unary_union(multi_poly) # if isinstance(merged_poly, MultiPolygon): # merged_poly = merged_poly.convex_hull # 4. 转换为你需要的坐标结构(去掉闭合用的重复首尾点) merged_coords = list(merged_poly.exterior.coords) if merged_coords[0] == merged_coords[-1]: merged_coords.pop() return merged_coords # 示例用法 flat_multipoly_coords = [ [0,0], [0,1], [1,0], # 第一个三角形 [2,2], [2,3], [3,2], # 第二个三角形 [1,3], [2,4], [3,3] # 第三个三角形 ] result = flatten_multipolygon_to_single_polygon(flat_multipoly_coords) print("合并后的单个Polygon坐标:") print(result)
关键说明
- 坐标拆分:脚本默认每个多边形固定3个点,若你的多边形点数不固定,需要调整拆分逻辑(比如提前传入每个多边形的点数量,或用分隔符标记多边形边界)。
- 合并逻辑:
- 凸包(convex_hull):直接生成包含所有点的最小凸多边形,完全满足你“允许覆盖不必要区域”的要求,逻辑最简单。
- 并集(unary_union):多边形重叠时会生成精确合并区域,但多边形分离时返回MultiPolygon,需再转成凸包确保是单个Polygon。
- 坐标闭合:Shapely的Polygon要求坐标首尾一致,脚本会自动处理,最后返回时移除重复点,匹配你需要的结构。
之前失败的可能原因
你给出的扁平坐标列表不是Shapely能直接识别的MultiPolygon格式,必须先拆分成单个Polygon的坐标集合,再创建MultiPolygon对象才能处理。
内容的提问来源于stack exchange,提问作者martmalo
相关产品推荐
相关产品推荐

