前言
有多个文件地理数据库(即.gdb格式的数据库),数据库内有多个要素类。要求将这些文件地理数据库中相同名称的要素类分别合并到一个文件地理数据库中。如果只有几个数据库,可以用arcgis自带的合并工具一个一个合并。但是,如果有一百个数据库,每个数据库里有十几个要素类,例如:将一百个县的年度变更数据库合并成一个,该怎么办?。如果一个一个添加到合并工具合并,这得要点多少次鼠标啊?今天给大家分享的GDB批量合并工具,就是为了解决这个问题。
一、ArcPy是什么?
ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。
该包提供了丰富纯正的 Python 体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。
以上是Esri官方给的答案,详情请看帮助文档 https://desktop.arcgis.com/zh-cn/arcmap/latest/analyze/arcpy/what-is-arcpy-.htm
总之,arcpy就是一个用python开发第三方库,可以用import导入python代码中。有了它python就可以调用ArcGIS的ArcToolBox中的工具进行地理数据的分析、数据转换、数据管理等操作。
二、GDB批量合并工具开发思路
- 1.第一层循环,遍历文件夹下所有文件地理数据库。第二层循环,遍历每个数据库中要素类,获取要素类名称分别添加到列表中,相同名称只添加一次。得到的要素类名称列表就是合并后数据库中所有的要素类名称。
- 2.第一层循环,遍历得到要素类名称列表。第二层循环,遍历一次文件地理数据库,判断数据库中是否存在该名称的要素类,存在,则拼接绝对路径并添加到列表中。将绝对路径列表作为参数,调用合并工具合并该图层。
python中使用arcpy合并工具语法:
代码示例:
import arcpy
arcpy.env.workspace = "C:/data"
arcpy.Merge_management(["majorrds.shp", "Habitat_Analysis.gdb/futrds"], "C:/output/Output.gdb/allroads")
三、GDB批量合并工具代码
完整代码如下:
# -*-coding: gbk -*-
import sys
import os
import arcpy
# 添加这两行可以解决乱码问题
reload(sys)
sys.setdefaultencoding("utf-8")
in_path = arcpy.GetParameterAsText(0) # 文件地理数据库(.gdb)所在文件夹路径
out_gdb_path = arcpy.GetParameterAsText(1) # 合并后输出的文件地理数据库(.gdb)路径
# 将文件地理数据库(.gdb)所在文件夹设置为当前工作空间环境
arcpy.env.workspace = in_path
# 获取当前工作环境下所有文件数据库列表
workspaces = arcpy.ListWorkspaces("*", "FileGDB")
# workspaces = arcpy.ListWorkspaces("*", "Access") # 个人地理数据库,即mdb格式
in_fc_list = [] # 用于存放gdb内的要素类名称的列表
# 遍历gdb
for wsp in workspaces:
# 将gdb设置为当前工作空间环境
arcpy.env.workspace = wsp
# 获取gdb内要素类列表
fc_lss = arcpy.ListFeatureClasses()
for fc in fc_lss:
if fc not in in_fc_list:
# 如果当前遍历到的要素类名称不在in_fc_list列表中,则添加到列表
in_fc_list.append(fc)
arcpy.AddMessage(u"共{0}个图层。".format(len(in_fc_list)))
cout = 0
# 遍历要素类名称列表
for infc in in_fc_list:
cout += 1
merge_list = [] # 用于存放所有gdb中相同名称的要素类的列表
arcpy.AddMessage(u" {0}.正在合并: {1}".format(cout, infc))
for wsp in workspaces:
# 重新遍历所有gdb,分别拼接路径
merge_fc = os.path.join(wsp, infc)
if arcpy.Exists(merge_fc):
# 如果当前遍历到的gdb内存在该名称的要素类,则添加到merge_list列表中
merge_list.append(merge_fc)
else:
# 如果当前遍历到的gdb内不存在该名称的要素类,则给出警告
arcpy.AddWarning(u" 警告:{0} 中不存在名称为 {1} 的要素类,请留意!".format(wsp, infc))
# 合并所有gdb中相同名称的要素类
arcpy.Merge_management(merge_list, os.path.join(out_gdb_path, infc))
del merge_list
四、GDB批量合并工具截图
总结
今天分享的GDB批量合并工具,比较简单,代码也很少,却也很实用(自认为😜)。arcpy脚本工具开发并不是很难,大多时候就是这么简单,只是把各种ArcGIS中自带的工具用python按自己的逻辑串连起来。只要掌握python基本语法,再看看ArcGIS的帮助文档,基本可以做出很多实用的小工具。今天的分享就到这,如有疑问或者工作中有什么实际需求,欢迎评论留言,有时间我会不定期分享。
GDB批量合并工具下载地址 https://download.csdn.net/download/qz_CSDN/87611470