有些GDB数据库会按分幅或行政区划进行分开储存,尤其是一些地形测绘或国情地理数据。
如下图所示:
数据是完整的,但使用的时候要一个一个拖进地图中,进行分析的时候也需要将其合并后使用。
因此就做了这个合库工具。
一、要实现的功能
如上图所示,在【数据处理】组—【GDB相关】面板下,点击【合并gdb数据库】工具。
在弹出的工具框中,分别输入参数:
1、输入要合并的GDB数据所在的文件夹。注意些文件夹下的所有gdb文件都会被读到,包括子文件夹下的。
2、输入合并后的GDB文件名,不需要输入【.gdb】。结果GDB文件会放在原文件夹下。
生成的GDB文件如下图所示:
生成GDB数据库的数据结构和原始GDB完全一致。
取一个要素查看一下,合并前的3个要素:
合并后的1个要素:
完美合并。
二、实现流程
合并其实比较简单。可以将同名要素收集起来,然后调用GP合并工具即可。
或者用【追加】工具也可以同样实现。
主要的工作反而是在分析数据结构。
获取GDB数据库中的所有要素数据集和所有要素,根据其原来的数据路径,在目标GDB数据库中,同样创建要素数据集和要素类,并进行复制追加或合并复制。
主要代码如下:
await QueuedTask.Run(() =>
{// 获取所有GDB文件List<string> gdbFiles = gdbFolder.GetAllGDBFilePaths();// 创建合并GDBstring gdbPath = Arcpy.CreateFileGDB(gdbFolder, gdbName);// 要素数据集列表List<string> dataBaseNames = new List<string>();// 要素类列表List<string> featureClassNames = new List<string>();foreach (string gdbFile in gdbFiles){// 获取FeatureClassusing (Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdbFile)))){// 获取要素数据集IReadOnlyList<FeatureDatasetDefinition> featureDatases = gdb.GetDefinitions<FeatureDatasetDefinition>();// 新建要素数据集if (featureDatases.Count > 0){foreach (var featureDatase in featureDatases){string dbName = featureDatase.GetName();if (!dataBaseNames.Contains(dbName)) // 如果是新的,就创建{Arcpy.CreateFeatureDataset(gdbPath, dbName, featureDatase.GetSpatialReference());}dataBaseNames.Add(dbName);}}// 获取要素类IReadOnlyList<FeatureClassDefinition> featureClasses = gdb.GetDefinitions<FeatureClassDefinition>();if (featureClasses.Count > 0){foreach (var featureClass in featureClasses){string fcName = featureClass.GetName();FeatureClass fc = gdb.OpenDataset<FeatureClass>(fcName);// 获取要素类路径string fcPath = fc.GetPath().ToString().Replace("file:///", "").Replace("/", @"\");// 获取目标路径string targetPath = gdbPath + fcPath[(fcPath.IndexOf(".gdb") + 4)..];if (!featureClassNames.Contains(fcName)) // 如果是新的,就复制要素类{Arcpy.CopyFeatures(fcPath, targetPath);featureClassNames.Add(fcName);}else // 如果已经有要素了,就追加{Arcpy.Append(fcPath, targetPath);}}}}}
});
其中获取所有GDB数据库文件的GetAllGDBFilePaths()方法如下:
// 获取输入文件夹下的所有GDB文件
public static List<string> GetAllGDBFilePaths(this string folderPath)
{List<string> gdbFilePaths = new List<string>();DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);// 检查文件夹是否存在if (!directoryInfo.Exists){throw new DirectoryNotFoundException("指定的文件夹路径不存在!");}// 查找所有GDB数据库文件(.gdb文件夹)DirectoryInfo[] gdbDirectories = directoryInfo.GetDirectories("*.gdb", SearchOption.AllDirectories);foreach (DirectoryInfo gdbDirectory in gdbDirectories){// 获取GDB数据库的路径string gdbPath = gdbDirectory.FullName.Replace(@"/", @"\");// 添加到列表中gdbFilePaths.Add(gdbPath);}return gdbFilePaths;
}
三、工具文件分享
我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:
【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345