如何使用Geopandas切割JSON文件中的几何图形并自动化处理多边形?
用Geopandas实现多边形切割与合并并导出JSON
核心实现步骤
- 识别所有存在重叠关系的多边形对
- 对每对重叠多边形,用
difference操作切割掉重叠区域,保留各自非重叠部分 - 将所有非重叠部分合并到最后一个多边形中
- 把处理后的多边形导出为包含(X,Y)坐标的JSON文件
完整代码示例
import geopandas as gpd from shapely.geometry import Polygon, MultiPolygon import json # 1. 读取输入多边形数据(支持GeoJSON/Shapefile) gdf = gpd.read_file("input_polygons.geojson") # 过滤仅保留多边形/多面形数据 gdf = gdf[gdf.geometry.type.isin(['Polygon', 'MultiPolygon'])] # 2. 找出所有重叠多边形对 overlap_pairs = [] for i in range(len(gdf)): for j in range(i+1, len(gdf)): if gdf.iloc[i].geometry.overlaps(gdf.iloc[j].geometry): overlap_pairs.append((i, j)) # 3. 切割重叠区域,收集非重叠部分 non_overlap_parts = [] processed_indices = set() for idx1, idx2 in overlap_pairs: if idx1 not in processed_indices: # 移除当前多边形与另一多边形的重叠区域 diff_geom = gdf.iloc[idx1].geometry.difference(gdf.iloc[idx2].geometry) if not diff_geom.is_empty: non_overlap_parts.append(diff_geom) processed_indices.add(idx1) if idx2 not in processed_indices: diff_geom = gdf.iloc[idx2].geometry.difference(gdf.iloc[idx1].geometry) if not diff_geom.is_empty: non_overlap_parts.append(diff_geom) processed_indices.add(idx2) # 4. 将非重叠部分合并到最后一个多边形 target_geom = gdf.iloc[-1].geometry if non_overlap_parts: merged_geom = target_geom.union(MultiPolygon(non_overlap_parts)) else: merged_geom = target_geom # 5. 转换为(X,Y)坐标格式的JSON def geom_to_coords(geom): if isinstance(geom, Polygon): # 提取外环坐标,保持(X,Y)顺序 coords = list(geom.exterior.coords) return {"type": "Polygon", "coordinates": [coords]} elif isinstance(geom, MultiPolygon): poly_coords = [] for poly in geom.geoms: poly_coords.append(list(poly.exterior.coords)) return {"type": "MultiPolygon", "coordinates": poly_coords} result_json = { "processed_polygon": geom_to_coords(merged_geom) } # 导出JSON文件 with open("output_polygons.json", "w") as f: json.dump(result_json, f, indent=2)
关键逻辑说明
overlaps():判断两个多边形是否存在有效重叠区域,是核心的重叠检测方法difference():计算多边形差集,精准移除重叠部分,保留各自独立区域union():将多个零散多边形合并为一个整体(支持多面形格式)- 坐标转换:手动提取Shapely几何的坐标点,确保输出严格遵循(X,Y)的顺序要求
注意事项
- 若输入包含MultiPolygon,代码会自动处理其中的子多边形
- 无重叠多边形时,直接保留最后一个多边形作为结果
- 导出的JSON结构兼容GeoJSON规范,可直接用于其他空间分析工具
内容的提问来源于stack exchange,提问作者Brandon Ney Ccahua Yapo
相关产品推荐
相关产品推荐

