合并单个文件内多个重叠的多边形面矢量
合并单个文件内多个重叠的多边形面矢量
ytkz引言
传统操作
面矢量合并,在arcgis是一个常见的操作。使用ArcGIS合并重叠的多边形的步骤如下:
- 准备数据:首先需要准备待处理的重叠多边形数据,这可以通过遥感影像解译、野外实地调查等方式获得。
- 构建重叠区域图层:使用ArcGIS的”Union”工具,将重叠的多边形数据层合并为一个新图层。
- 进行拓扑合并:使用ArcGIS的”TopologicalUnion”工具,对重叠区域图层进行拓扑合并。这个过程会自动将重叠区域合并为一个新的多边形。
完成上述步骤后,即可完成多边形的合并。注意,以上步骤可能会根据具体的重叠情况和数据类型有所变化,需要具体问题具体分析。
那如何用代码实现这个功能呢?
测试数据
以德国矢量作为测试数据。
代码
#!/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)
代码分析
这段代码的目的是合并重叠的多边形。以下是代码的详细分析:
- 导入必要的库:
fiona
:用于读写地理空间数据格式,如Shapefile。shapely.ops.unary_union
:用于将多个几何对象合并为一个对象。shapely.geometry
:用于创建、编辑和分析几何对象。
- 定义
dissolve_overlapping_polygons
函数:- 参数
src
:输入的Shapefile路径。dst
:输出的Shapefile路径。
- 功能:读取输入的Shapefile,合并重叠的多边形,并将结果写入到输出文件。
- 参数
- 处理Shapefile:
- 使用
fiona.open
打开输入的Shapefile,并获取其坐标参考系统(CRS)和驱动程序。 - 使用
filter
函数和is_valid
方法筛选出有效的几何对象(即非自交的多边形)。 - 将筛选后的几何对象转换为Shapely对象,并使用
unary_union
函数进行合并。
- 使用
- 定义输出文件的模式:
- 定义了输出的Shapefile的模式,其中几何类型为”Polygon”,属性中有一个”id”字段。
- 写入输出文件:
- 使用
fiona.open
打开输出文件,并使用定义的schema和CRS。 - 遍历合并后的多边形,将每个多边形的几何信息和属性(在这里,属性只有一个id)写入到输出文件。
- 使用
- 主函数:定义了输入和输出文件的路径,并调用上述函数进行合并操作。
- 异常处理:如果在写入过程中出现异常,会捕获该异常并打印出来。
注意:代码中没有处理不同坐标参考系统的问题,如果输入和输出文件的CRS不同,可能需要进行坐标转换。此外,为了代码的正常运行,你需要确保安装了所有必要的库,包括Fiona和Shapely。
结果展示
代码分享
在公众号回复”合并多边形面”,获取代码及测试数据。