【ArcGIS Pro二次开发】(78):批量合并GDB数据库

有些GDB数据库会按分幅或行政区划进行分开储存,尤其是一些地形测绘或国情地理数据。

如下图所示:

数据是完整的,但使用的时候要一个一个拖进地图中,进行分析的时候也需要将其合并后使用。

因此就做了这个合库工具。


一、要实现的功能

如上图所示,在【数据处理】组---【GDB相关】面板下,点击【合并gdb数据库】工具。

在弹出的工具框中,分别输入参数:

1、输入要合并的GDB数据所在的文件夹。注意些文件夹下的所有gdb文件都会被读到,包括子文件夹下的。

2、输入合并后的GDB文件名,不需要输入【.gdb】。结果GDB文件会放在原文件夹下。

生成的GDB文件如下图所示:

生成GDB数据库的数据结构和原始GDB完全一致。

取一个要素查看一下,合并前的3个要素:

合并后的1个要素:

完美合并。


二、实现流程

合并其实比较简单。可以将同名要素收集起来,然后调用GP合并工具即可。

或者用【追加】工具也可以同样实现。

主要的工作反而是在分析数据结构。

获取GDB数据库中的所有要素数据集和所有要素,根据其原来的数据路径,在目标GDB数据库中,同样创建要素数据集和要素类,并进行复制追加或合并复制。

主要代码如下:

cs 复制代码
await QueuedTask.Run(() =>
{
    // 获取所有GDB文件
    List<string> gdbFiles = gdbFolder.GetAllGDBFilePaths();

    // 创建合并GDB
    string gdbPath = Arcpy.CreateFileGDB(gdbFolder, gdbName);
    // 要素数据集列表
    List<string> dataBaseNames = new List<string>();
    // 要素类列表
    List<string> featureClassNames = new List<string>();

    foreach (string gdbFile in gdbFiles)
    {
        // 获取FeatureClass
        using (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()方法如下:

cs 复制代码
// 获取输入文件夹下的所有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

相关推荐
新手unity自用笔记12 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen13 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder16 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba17 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech17 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo58520 小时前
C#中虚函数和抽象函数的概念
开发语言·c#
开心工作室_kaic1 天前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
时光追逐者1 天前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff1 天前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
hiyo5852 天前
C#的面向对象
开发语言·c#