GeoSeries.plot无法正确绘制shapely定义的带孔洞Polygon问题咨询
问题原因
这个差异是由多边形环的环绕方向不匹配绘图库的填充规则导致的,具体逻辑如下:
- shapely本身对多边形内外环的方向有内置的标准化逻辑,你定义的带洞Polygon存入shapely对象时,内部会自动修正环方向保证正确性,所以直接查看shapely对象时形态正常。
- geopandas的
.plot()方法底层依赖matplotlib实现填充,matplotlib的路径填充遵循非零缠绕规则:只有当内外环环绕方向相反时,内环区域才会被识别为孔洞不填充。 - 旧版本的geopandas绘图时不会主动调用shapely的环标准化逻辑,会直接提取你输入的原始坐标序列传给matplotlib,你定义的两个内环的顶点顺序和外环方向一致,导致matplotlib无法识别为孔洞,最终绘制形态异常。
解决方法
你可以任选一种方案修复:
- 升级到geopandas 0.12及以上版本,新版本已经内置了绘图前自动标准化多边形环方向的逻辑,无需额外修改代码。
- 手动修正内环顶点顺序,保证所有内环的环绕方向和外环相反:你当前的外环是逆时针顺序,把两个内环的顶点序列倒序排列即可。
- 绘图前手动调用shapely的标准化方法,修正环方向:
from shapely.geometry import Polygon import geopandas as gpd s = Polygon([(0, 0), (0, 5), (5, 5), (5, 0)], [[(1, 1), (2, 1), (1, 2)], [(1, 4), (2, 4), (2, 3)]]) # 手动标准化多边形 s = s.normalize() t = gpd.GeoSeries(s) t.plot()
内容的提问来源于stack exchange,提问作者Hitori Ajimu
相关产品推荐
相关产品推荐

