【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

本工具主要是针对国空数据入库而做的。

如果你手头已经整理了一部分要素类数据,但是数据格式,字段值可能并没有完全按照规范设置好,需要将这些数据按规范批量和库,就可以尝试用这个工具。

准备数据:标准空库、你已做好的数据。

做好的数据需要把要素名改成和标准空库对应的要素同名。

如果你想把某些有用的字段值导入到标准空库,同样的字段名也要和对应字段同名。


一、要实现的功能

如上图所示,点击【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工具箱icon-default.png?t=N6B9https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29694.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb,redis,mysql 区别

一、MySQL 关系型数据库。 在不同的引擎上有不同 的存储方式。 查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&#xff0c;成熟度很高。 开源数据库的份额在不断增加&#xff0c;mysql的份额页在持续增长。 缺点就是在海量数据处理的时候效率会显著变慢。 二、Mo…

Java8之Stream流

目录 简介 特点 Stream操作步骤 创建 中间操作 筛选与切片 filter(Predicate p) distinct() limit(long maxSize) skip(long n) 映射 map(Function f) flatMap(Function f) 排序 自然排序 定制排序 终止操作 匹配与查找 归约 收集 好处 不足 简介 在编写…

postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 表锁介绍 当表打开&#xff0c;或者操作表时&#xff0c;都需要…

应用案例|探索高精度3D机器视觉在车间滑橇检测与测量中的应用

Part.1 应用行业 随着科技的不断进步&#xff0c;3D机器视觉技术逐渐成为了现实世界与数字世界之间的桥梁。3D机器视觉技术能使计算机感知和理解三维空间重的物体和场景&#xff0c;被广泛应用于机器人引导、工业检测等行业&#xff0c;例如&#xff1a;物流、电商、教育、医疗…

知识图谱推理的学习逻辑规则(上)

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型知识图谱推理逻辑规则概率形式化参数化优化 实验实验设置实验结果 结论 原文&#xff1a; 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则。 逻辑规则用于预测时提供了可解释性并且可以推广到其他任务中&#xff0c;因…

【Ceph集群应用】Ceph块存储之RBD接口详解

Ceph块存储之RBD接口详解 1.创建Ceph块存储系统RBD接口1.1 删除镜像1.2 还原镜像1.3 在线扩容1.4 回滚镜像到指定位置1.5 删除快照1.6 快照分层1.7 快照展平1.8 镜像的导出导入 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph块存储系统RBD接口 &#xff08;1&#xff09;…

Godot实用代码-存取存档的程序设计

1. Settings.gd 全局变量 用于保存玩家设置 对应Settings.json 2. Data.gd 全局变量 用于保存玩具数据 对应Data.json 实践逻辑指南 1.在游戏开始的时候&#xff08;游戏场景入口的_ready()处&#xff0c; Settings.gd

【源码解析】Mybatis执行原理

Mybatis执行原理 1.获取SqlSessionFactory2.创建SqlSession3.创建Mapper、执行SQL MyBatis 是一款优秀的持久层框架&#xff0c;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和…

密码学学习笔记(十二):压缩函数 - Davies–Meyer结构

密码学中压缩函数是指将输入的任意长度消息压缩为固定长度输出的函数。压缩函数以两个特定长度的数据为输入&#xff0c;产生与其中一个输入大小相同的输出。简单来说就是它接受一些较长的数据&#xff0c;输出更短的数据。 压缩函数接收长度为X和Y的两个不同输入&#xff0c;并…

输入 jar cvf 后指令提示‘jar‘ 不是内部或外部命令,也不是可运行的程序

输入 jar cvf 后指令提示jar 不是内部或外部命令&#xff0c;也不是可运行的程序 一堆说jdk系统环境配置的文章&#xff0c;我都看哭了&#xff0c;还好有这位老兄拯救了我&#xff01;&#xff01;&#xff01;献上地址 https://www.cnblogs.com/wadezhou/p/16647474.html 我输…

[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

初级的操作就是CRUD&#xff0c;但是高级的操作也是CRUD&#xff0c;只是语句写的更加复杂&#xff0c;不再是select * from table&#xff1b;这样简单&#xff0c;这次咱们学一些稍微高级点的。下面是上一篇文章。 [SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…