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

计算多边形面积并排序,解决contourf导出GeoJSON重复边框问题

解决contourf轮廓转GeoJSON的重叠双线问题

问题分析

用matplotlib的contourf生成等高线填充后导出GeoJSON时,相邻等高线对应的多边形会共享边界,导致最终GeoJSON出现重叠的双线边框。需要通过面积计算、排序和空间运算,生成无重复边框的多边形集合。

修改后的代码

t = ax.contourf(xi, yi, z1, cmap="rainbow_r", levels=20, antialiased=False)

poly_list = []
for col in t.collections:
    for contour_path in col.get_paths(): 
        for ncp, cp in enumerate(contour_path.to_polygons()):
            x = cp[:, 0]
            y = cp[:, 1]
            new_shape = geometry.Polygon([(i[0], i[1]) for i in zip(x, y)])
            if ncp == 0:
                poly = new_shape
            else:
                # 挖去内部空洞
                poly = poly.difference(new_shape)
    # 收集每个level处理好的带洞多边形
    poly_list.append(poly)

# 1. 计算每个多边形的面积,按面积从大到小排序
poly_list.sort(key=lambda p: p.area, reverse=True)

# 2. 去除重叠边框:用当前多边形减去已处理的更大多边形,消除共享边界
processed_polys = []
for idx, poly in enumerate(poly_list):
    if idx == 0:
        processed_polys.append(poly)
    else:
        # 减去前面所有更大的多边形,仅保留当前多边形独有的区域
        for prev_poly in processed_polys:
            poly = poly.difference(prev_poly)
        if not poly.is_empty:
            processed_polys.append(poly)

# 3. 生成最终的FeatureCollection
poly_features = [Feature(geometry=p) for p in processed_polys]
feature_collection = FeatureCollection(poly_features)

代码说明

  • 带洞多边形处理:保留原代码逻辑,处理每个等高线的内外环,生成带空洞的单个多边形。
  • 面积排序:按多边形面积从大到小排序,确保先处理范围更大的外层多边形。
  • 去重叠边界:遍历排序后的多边形,用当前多边形减去所有已处理的更大多边形,让每个最终多边形仅保留自身独有的区域,彻底消除相邻多边形的共享边界,避免双线重叠。

效果示意图说明

  • 示意图1:原始contourf生成的轮廓,可见多处重叠的双线边框
  • 示意图2:局部放大后,能清晰看到两条重合的边界线
  • 示意图3:处理后得到的无重复边框的多边形,边界唯一且无重叠

内容的提问来源于stack exchange,提问作者kregtopoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:36:08