解决Shapely中MultiPolygon与Polygon混合引发的弃用警告及绘图空白问题
解决Shapely 1.8.0+版本中混合Polygon/MultiPolygon数据的地图着色绘图问题
问题根源
Shapely 1.8.0及以上版本弃用了直接迭代MultiPolygon对象的旧方式,要求通过.geoms属性访问其组成部分,但Polygon对象本身没有.geoms属性,直接调用会触发AttributeError;同时旧代码的迭代逻辑失效会导致绘图空白,伴随大量弃用警告。
解决方案
方法1:用GeoPandas的explode方法(推荐,最简洁)
GeoPandas 0.10+版本提供的explode方法可以自动将MultiPolygon拆分为单个Polygon,同时保留原数据的所有属性,完美适配混合类型的几何数据:
# 假设你的地理数据存储在GeoDataFrame gdf中,数值列名为value_column # 拆分MultiPolygon为单个Polygon,index_parts=True保留拆分后的索引关联 exploded_gdf = gdf.explode(index_parts=True) # 直接调用plot方法着色绘图 exploded_gdf.plot( column='value_column', cmap='viridis', # 可替换为你需要的配色方案 edgecolor='gray', legend=True ) plt.show()
方法2:自定义函数扁平化几何对象
如果无法使用GeoPandas的explode,可以手动写一个辅助函数,判断几何类型并拆分:
from shapely.geometry import Polygon, MultiPolygon import matplotlib.pyplot as plt def flatten_geoms(geom): """将Polygon/MultiPolygon转换为单个Polygon的列表""" if isinstance(geom, MultiPolygon): return list(geom.geoms) elif isinstance(geom, Polygon): return [geom] return [] # 处理数据,拆分几何并对应数值 flattened_geometries = [] corresponding_values = [] for _, row in gdf.iterrows(): geoms = flatten_geoms(row['geometry']) flattened_geometries.extend(geoms) # 每个拆分后的Polygon对应原行的数值 corresponding_values.extend([row['value_column']] * len(geoms)) # 绘图 fig, ax = plt.subplots() # 构建颜色映射 vmin, vmax = min(corresponding_values), max(corresponding_values) norm = plt.Normalize(vmin=vmin, vmax=vmax) cmap = plt.cm.viridis for geom, val in zip(flattened_geometries, corresponding_values): ax.add_geometries( [geom], crs=gdf.crs, facecolor=cmap(norm(val)), edgecolor='gray' ) # 设置地图范围 ax.set_xlim(gdf.total_bounds[0], gdf.total_bounds[2]) ax.set_ylim(gdf.total_bounds[1], gdf.total_bounds[3]) plt.show()
效果说明
两种方法都能解决类型不兼容的问题,消除Shapely弃用警告,同时确保所有县的几何图形都能被正确渲染,不会出现空白绘图的情况。
内容的提问来源于stack exchange,提问作者Elsri
相关产品推荐
相关产品推荐

