Geopandas中将带孔洞Multipolygon转换为单一Polygon的报错如何解决
报错原因
你的SHAPE列几何类型不统一,同时包含Polygon和MultiPolygon两类要素,原有代码默认所有要素都是MultiPolygon直接遍历,当作用到单个Polygon对象时就会抛出不可迭代的类型错误。且原有代码输出的仍然是MultiPolygon类型,不符合你转单个Polygon的需求。
解决代码
首先定义兼容两类几何输入、可填充孔洞并输出单个Polygon的处理函数:
from shapely.geometry import Polygon, MultiPolygon from shapely.ops import unary_union def fill_holes_to_polygon(geom): # 处理单个Polygon:直接取外轮廓去除孔洞 if isinstance(geom, Polygon): return Polygon(geom.exterior) # 处理MultiPolygon elif isinstance(geom, MultiPolygon): # 遍历所有子Polygon,逐个去除孔洞 no_hole_parts = [Polygon(p.exterior) for p in geom.geoms] # 合并所有子部件 merged_geom = unary_union(no_hole_parts) # 合并后为单个Polygon直接返回,为多部件则取凸包得到单个Polygon return merged_geom if isinstance(merged_geom, Polygon) else merged_geom.convex_hull # 非面类几何直接返回,可按需调整为空值 return geom
将函数应用到GeoDataFrame:
gdf['Polygon'] = gdf['SHAPE'].apply(fill_holes_to_polygon)
验证转换结果
执行以下代码可确认转换后所有要素都是Polygon类型:
print(gdf['Polygon'].apply(lambda x: type(x).__name__).value_counts())
可选调整
如果你的MultiPolygon包含多个不相邻的子部件,不想用凸包合并,可修改逻辑保留面积最大的子部件:
# 替换上述合并后的逻辑即可 if isinstance(merged_geom, Polygon): return merged_geom else: # 取面积最大的子Polygon return max(merged_geom.geoms, key=lambda p: p.area)
内容的提问来源于stack exchange,提问作者SCool
相关产品推荐
相关产品推荐

