合并单个文件内多个重叠的多边形面矢量

引言

传统操作

面矢量合并,在arcgis是一个常见的操作。使用ArcGIS合并重叠的多边形的步骤如下:

  1. 准备数据:首先需要准备待处理的重叠多边形数据,这可以通过遥感影像解译、野外实地调查等方式获得。
  2. 构建重叠区域图层:使用ArcGIS的”Union”工具,将重叠的多边形数据层合并为一个新图层。
  3. 进行拓扑合并:使用ArcGIS的”TopologicalUnion”工具,对重叠区域图层进行拓扑合并。这个过程会自动将重叠区域合并为一个新的多边形。

完成上述步骤后,即可完成多边形的合并。注意,以上步骤可能会根据具体的重叠情况和数据类型有所变化,需要具体问题具体分析。

那如何用代码实现这个功能呢?

测试数据

以德国矢量作为测试数据。

image-20240110144326993

代码

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
# @File : DissolveOverlappingPolygons.py
# 合并重叠的多边形

import fiona
from shapely.ops import unary_union
from shapely.geometry import shape, mapping

def dissolve_overlapping_polygons(src, dst):
    '''
    Dissolve overlapping polygons in a shapefile
    @param src: input shapefile
    @param dst: output shapefile
    @return:
    '''
    with fiona.open(src, 'r') as ds_in:
        crs = ds_in.crs
        drv = ds_in.driver

        filtered = filter(lambda x: shape(x["geometry"]).is_valid, list(ds_in))

        geoms = [shape(x["geometry"]) for x in filtered]
        dissolved = unary_union(geoms)

    schema = {
        "geometry": "Polygon",
        "properties": {"id": "int"}
    }

    with fiona.open(dst, 'w', driver=drv, schema=schema, crs=crs) as ds_dst:
        try:
            for i,g in enumerate(dissolved.geoms):
                ds_dst.write({"geometry": mapping(g), "properties": {"id": i}})
        except Exception as e:
            print(e)

if __name__ == '__main__':
    src = r"D:\gadm\Germany\gadm41_DEU_0.shp"
    dst = r"D:\gadm\Germany\gadm41_DEU_0_merge.shp"
    dissolve_overlapping_polygons(src,dst)

代码分析

这段代码的目的是合并重叠的多边形。以下是代码的详细分析:

  1. 导入必要的库
    • fiona:用于读写地理空间数据格式,如Shapefile。
    • shapely.ops.unary_union:用于将多个几何对象合并为一个对象。
    • shapely.geometry:用于创建、编辑和分析几何对象。
  2. 定义dissolve_overlapping_polygons函数
    • 参数
      • src:输入的Shapefile路径。
      • dst:输出的Shapefile路径。
    • 功能:读取输入的Shapefile,合并重叠的多边形,并将结果写入到输出文件。
  3. 处理Shapefile
    • 使用fiona.open打开输入的Shapefile,并获取其坐标参考系统(CRS)和驱动程序。
    • 使用filter函数和is_valid方法筛选出有效的几何对象(即非自交的多边形)。
    • 将筛选后的几何对象转换为Shapely对象,并使用unary_union函数进行合并。
  4. 定义输出文件的模式
    • 定义了输出的Shapefile的模式,其中几何类型为”Polygon”,属性中有一个”id”字段。
  5. 写入输出文件
    • 使用fiona.open打开输出文件,并使用定义的schema和CRS。
    • 遍历合并后的多边形,将每个多边形的几何信息和属性(在这里,属性只有一个id)写入到输出文件。
  6. 主函数:定义了输入和输出文件的路径,并调用上述函数进行合并操作。
  7. 异常处理:如果在写入过程中出现异常,会捕获该异常并打印出来。

注意:代码中没有处理不同坐标参考系统的问题,如果输入和输出文件的CRS不同,可能需要进行坐标转换。此外,为了代码的正常运行,你需要确保安装了所有必要的库,包括Fiona和Shapely。

结果展示

image-20240110144730011

代码分享

在公众号回复”合并多边形面”,获取代码及测试数据。