如何使用GeoPandas为共边多边形的内侧半段边界上色?
实现多边形内侧边界双色效果的解决方案
直接调用boundary绘制的是完整的边界线,要实现仅内侧一半上色的双色边界效果,核心思路是通过几何运算提取出多边形的内侧边界线段,以下是两种可行的实现方法:
方法一:缓冲区差集法(稳定性高)
通过向内缓冲多边形,再计算原边界与缓冲后边界的差集,得到仅属于内侧的边界部分:
import geopandas as gpd import matplotlib.pyplot as plt fig, ax = plt.subplots() # 向内缓冲距离,需匹配坐标系单位(如投影坐标系用米/像素,地理坐标系需先转投影) # 数值建议设为linewidth的1/3~1/2,避免超出多边形范围 buffer_distance = -2 data = [ (gpd.read_file("shape1.shp"), "#f2a6a5"), (gpd.read_file("shape2.shp"), "#fbebc0"), (gpd.read_file("shape3.shp"), "#dacbab"), ] for poly, color in data: # 修复几何拓扑错误,避免缓冲操作失败 poly = poly.make_valid() # 若使用地理坐标系(如EPSG:4326),需先转换为投影坐标系再缓冲 # poly = poly.to_crs(epsg=32633) # 替换为对应区域的UTM投影EPSG # 对多边形执行向内缓冲 buffered_poly = poly.buffer(buffer_distance, join_style=2) # 计算原边界与缓冲后边界的差集,得到内侧边界 inner_boundary = poly.boundary.difference(buffered_poly.boundary) # 绘制内侧边界 inner_boundary.plot( ax=ax, color=color, linestyle="solid", linewidth=6, ) # 可选:填充多边形底色(若需要) # for poly, color in data: # poly.plot(ax=ax, color=color, alpha=0.6) plt.show()
关键说明:
buffer_distance:负数表示向内缓冲,数值需根据linewidth调整,确保绘制的内侧线条不会超出多边形范围。make_valid():处理多边形可能存在的拓扑错误(如自相交),避免缓冲运算报错。- 地理坐标系适配:如果你的数据是WGS84(EPSG:4326)这类地理坐标系,必须先转换为投影坐标系(如UTM)再执行缓冲,否则缓冲距离的单位是度,结果会严重失真。
方法二:偏移曲线法(更简洁)
利用LineString的offset_curve方法直接生成向内偏移的边界曲线,适合几何形状较简单的多边形:
import geopandas as gpd import matplotlib.pyplot as plt fig, ax = plt.subplots() # 偏移距离,负数表示向内,数值设为linewidth的一半即可 offset_distance = -3 data = [ (gpd.read_file("shape1.shp"), "#f2a6a5"), (gpd.read_file("shape2.shp"), "#fbebc0"), (gpd.read_file("shape3.shp"), "#dacbab"), ] for poly, color in data: poly = poly.make_valid() # 生成向内偏移的边界曲线 offset_boundary = poly.boundary.apply(lambda geom: geom.offset_curve(offset_distance)) # 绘制偏移后的内侧边界 offset_boundary.plot( ax=ax, color=color, linestyle="solid", linewidth=6, ) plt.show()
关键说明:
offset_distance:数值设为linewidth的一半(如linewidth=6则设为-3),确保线条刚好覆盖内侧半宽。- 复杂几何适配:如果多边形边界有大量尖锐拐角或自相交,
offset_curve可能生成无效几何,此时建议使用方法一。
内容的提问来源于stack exchange,提问作者djangoliv
相关产品推荐
相关产品推荐

