本工具主要是针对国空数据入库而做的。
如果你手头已经整理了一部分要素类数据,但是数据格式,字段值可能并没有完全按照规范设置好,需要将这些数据按规范批量和库,就可以尝试用这个工具。
准备数据:标准空库、你已做好的数据。
做好的数据需要把要素名改成和标准空库对应的要素同名。
如果你想把某些有用的字段值导入到标准空库,同样的字段名也要和对应字段同名。
一、要实现的功能
如上图所示,点击【GDB相关】下的【要素类追加至空库(批量)】工具。
在弹出的工具框中,分别输入要素类所在的GDB数据库、GDB空库和要保存生成数据库的位置。
点击执行即可,生成结果如下:
如右图所示,工具读取输入GDB里的要素名,如果和空库里的要素同名,就会执行【追加】,输入的要素如果有和空库要素同名字段,则会保留字段和字段值,如果存在空库要素没有的字段,则丢弃该字段。
二、实现流程
首先,要把空库复制一份,不能直接修改空库。
// 复制空库
ToolManager.CopyAllFiles(gdb_empty_path, folder_path + @"/result_all.gdb");
调用的方法:
// 复制文件夹下的所有文件到新的位置public static void CopyAllFiles(string sourceDir, string destDir){//目标目录不存在则创建if (!Directory.Exists(destDir)){Directory.CreateDirectory(destDir);}DirectoryInfo sourceDireInfo = new DirectoryInfo(sourceDir);List<FileInfo> fileList = new List<FileInfo>();GetFileList(sourceDireInfo, fileList); // 获取源文件夹下的所有文件List<DirectoryInfo> dirList = new List<DirectoryInfo>();GetDirList(sourceDireInfo, dirList); // 获取源文件夹下的所有子文件夹// 创建目标文件夹结构foreach (DirectoryInfo dir in dirList){string sourcePath = dir.FullName;string destPath = sourcePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径if (!Directory.Exists(destPath)){Directory.CreateDirectory(destPath); // 创建目标文件夹}}// 复制文件到目标文件夹foreach (FileInfo fileInfo in fileList){string sourceFilePath = fileInfo.FullName;string destFilePath = sourceFilePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径File.Copy(sourceFilePath, destFilePath, true); // 复制文件,允许覆盖目标文件}}
工具的核心是应用【追加】工具,所以需要获取各个要素类的完整路径,这里不能直接用gdb路径+要素名,因为可能存在要素数据集。所以这里写一个方法来获取要素类的完整路径:
// 获取数据库下的所有要素类的完整路径public static List<string> GetFeatureClassPath(string gdb_path){List<string> result = new List<string>();// 打开GDB数据库using Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb_path)));// 获取所有要素类IReadOnlyList<FeatureClassDefinition> featureClasses = gdb.GetDefinitions<FeatureClassDefinition>();foreach (FeatureClassDefinition featureClass in featureClasses){using (FeatureClass fc = gdb.OpenDataset<FeatureClass>(featureClass.GetName())){// 获取要素类路径string fc_path = fc.GetPath().ToString().Replace("file:///", "");result.Add(fc_path);}}return result;}
考虑到入库还有表格,这里同样也要获取表格的路径:
// 获取数据库下的所有独立表的完整路径public static List<string> GetTablePath(string gdb_path){List<string> result = new List<string>();// 打开GDB数据库using Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb_path)));// 获取所有独立表IReadOnlyList<TableDefinition> tables = gdb.GetDefinitions<TableDefinition>();foreach (TableDefinition tableDef in tables){using (Table table = gdb.OpenDataset<Table>(tableDef.GetName())){// 获取要素类路径string fc_path = table.GetPath().ToString().Replace("file:///", "");result.Add(fc_path);}}return result;}
获取路径后,再将对应的路径做成Dictionary备用:
// 获取要素类和表的完整路径List<string> in_data_paths = ToolManager.GetFeatureClassAndTablePath(gdb_path);List<string> empty_data_paths = ToolManager.GetFeatureClassAndTablePath(folder_path + @"/result_all.gdb");// 创建dict,捕捉同名要素类和独立表Dictionary<string, string> keyValuePairs= new Dictionary<string, string>();foreach (var da in in_data_paths){// 提取要素类或独立表名string in_name = da[(da.LastIndexOf(@"/") + 1)..];foreach (var em in empty_data_paths){string em_name = em[(em.LastIndexOf(@"/") + 1)..];if (in_name == em_name){keyValuePairs.Add(da, em);break;}}}
最后执行【追加】工具即可:
// 执行追加工具foreach (var pair in keyValuePairs){string pair_name = pair.Key[(pair.Key.LastIndexOf(@"/") + 1)..];// 追加Arcpy.Append(pair.Key, pair.Value);}
以上就是工具的核心代码。
三、工具文件分享
我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:
【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。