计算多边形面积并排序,解决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
相关产品推荐
相关产品推荐

