You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:30:03