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

如何从GeoJSON的GeometryCollection过滤并转换为MultiPolygon

处理GeoJSON中的GeometryCollection并筛选多边形几何类型

核心思路

遍历GeoJSON的每个要素,递归提取所有Polygon和MultiPolygon类型的几何对象:

  • 直接保留Polygon,将MultiPolygon拆分为单个Polygon
  • 遍历GeometryCollection内的子几何,仅保留符合要求的类型
  • 最后将所有保留的Polygon合并为MultiPolygon,过滤掉无有效几何的要素

纯Python实现(无需第三方GIS库)

适合轻量处理,仅依赖内置json模块:

import json

def extract_valid_polygons(geometry):
    polygons = []
    
    def traverse(geom):
        geom_type = geom['type']
        if geom_type == 'Polygon':
            polygons.append(geom['coordinates'])
        elif geom_type == 'MultiPolygon':
            polygons.extend(geom['coordinates'])
        elif geom_type == 'GeometryCollection':
            for sub_geom in geom['geometries']:
                traverse(sub_geom)
        # 其他几何类型直接忽略
    
    traverse(geometry)
    return polygons

# 读取原始GeoJSON
with open('input.geojson', 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

# 处理每个要素
cleaned_features = []
for feat in raw_data['features']:
    valid_coords = extract_valid_polygons(feat['geometry'])
    if valid_coords:
        cleaned_feat = feat.copy()
        cleaned_feat['geometry'] = {
            'type': 'MultiPolygon',
            'coordinates': valid_coords
        }
        cleaned_features.append(cleaned_feat)

# 生成处理后的GeoJSON
cleaned_geojson = {
    'type': raw_data['type'],
    'features': cleaned_features,
    'crs': raw_data.get('crs')
}

# 保存结果
with open('output.geojson', 'w', encoding='utf-8') as f:
    json.dump(cleaned_geojson, f, indent=2)

基于Geopandas的进阶实现

适合复杂拓扑场景(如自动合并重叠多边形、修复几何有效性):

import geopandas as gpd

# 读取GeoJSON文件
gdf = gpd.read_file('input.geojson')

# 解析GeometryCollection,仅保留多边形几何
gdf['geometry'] = gdf['geometry'].apply(
    lambda geom: geom.unary_union if geom.type == 'GeometryCollection' else geom
)

# 过滤非多边形要素,统一转为MultiPolygon格式
valid_gdf = gdf[gdf['geometry'].type.isin(['Polygon', 'MultiPolygon'])]
valid_gdf['geometry'] = valid_gdf['geometry'].apply(
    lambda geom: gpd.GeoSeries([geom]).unary_union if geom.type == 'Polygon' else geom
)

# 保存处理结果
valid_gdf.to_file('output_geopandas.geojson', driver='GeoJSON')

注意事项

  • 确保输入GeoJSON格式合法,无语法错误
  • 纯Python实现仅处理几何结构,不做拓扑校验;Geopandas版本会自动修复无效几何
  • 若需要保留要素的全部属性,代码中已通过copy()方式完整保留原要素的properties字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:20:49