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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:10