【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段
在工作中可能会遇到这样的场景:有多个GDB要素、表格,或者是SHP文件,需要给这个要素或表添加相同的多个字段。
在这种情况下,手动添加就变得很繁琐,于是就做了这个工具。
需求具体如下图:
左图是待处理数据,有shp文件也有gdb文件。
右图是待添加字段的属性结构描述表,有4个参数,【字段名称、字段别名、字段类型、字段长度】。
(文件格式为Excel,文章末尾的下载链接会附上示例Excel)
工具的执行流程为:依次为左图待处理的数据添加右图定义好的字段。
一、要实现的功能
如上图所示,点击【字段处理】组【字段综合】面板下的【添加字段(批量)】工具。
在弹出的工具框中,分别输入参数:
1、包含要素或表格的文件夹。这里可以支持SHP文件和GDB文件,但不支持MDB。
2、包含字段属性的Excel表。这个表格的格式是固定的,在后面的工具链接里,我会将其一块共享,可自行下载,在此基础上修改可以少些错误。
E列的说明性文字只是查看用的,不会参与工具的计算(可以删掉)。这里列出6个字段类型格式,除此之外的类型文字是不认的。
3、关键字筛选。这是可选填的,如果你只想处理包含“规划”文字的要素和表,可以在关键字里输入。如果想全部处理,就可以不填任何文字。
最后点击执行即可,生成结果如下(以单个为例):
二、实现流程
第一步,从Excel表中获取字段的参数,返回双层List。
// 获取字段属性结构表List<List<string>> list_field_attribute = new List<List<string>>();// 建立 Excel 应用程序对象Application excelApp = new Application();// 打开 Excel 文件Workbook workbook = excelApp.Workbooks.Open(excel_path);// 获取工作表var worksheet = workbook.Worksheets[1];// 获取总行数int row_count = worksheet.UsedRange.Rows.Count;// 获取字段属性for (int i = 3; i < row_count; i++){// 获取字段属性string mc = worksheet.Cells[i, 1].Value.ToString(); // 字段名称string bm = worksheet.Cells[i, 2].Value.ToString(); // 字段别名string field_type = worksheet.Cells[i, 3].Value.ToString(); // 字段类型string lenth = worksheet.Cells[i, 4].Value.ToString(); // 字段长度// 加入list_field_attribute.Add(new List<string> { mc, bm, field_type, lenth });}
第二步,从输入的文件夹中获取所有要素类和表。
首先是shp文件的情况:
// 获取输入文件夹下的所有文件public static List<string> GetAllFiles(string folder_path, string key_word ="no match"){List<string> filePaths = new List<string>();// 获取当前文件夹下的所有文件string[] files = Directory.GetFiles(folder_path);// 判断是否包含关键字if (key_word == "no match"){filePaths.AddRange(files);}else{foreach (string file in files){// 检查文件名是否包含指定扩展名if (System.IO.Path.GetExtension(file).Equals(key_word, StringComparison.OrdinalIgnoreCase)){filePaths.Add(file);}}}// 获取当前文件夹下的所有子文件夹string[] subDirectories = Directory.GetDirectories(folder_path);// 递归遍历子文件夹下的文件foreach (string subDirectory in subDirectories){filePaths.AddRange(GetAllFiles(subDirectory, key_word));}return filePaths;}
要获取gdb文件下要素和表,首先要获取gdb文件:
public static List<string> GetAllGDBFilePaths(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;}
再从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:///", "").Replace("/", @"\");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:///", "").Replace("/", @"\");result.Add(fc_path);}}return result;}
获取所有输入要素和表后,即可添加字段:
【obj_all】为获取的所有要素和表的路径,【list_field_attribute】为获取的字段属性结构列表。
// 添加字段foreach (var ob in obj_all){string target_name = ob[ob.LastIndexOf(@"\")..];// 如果不含关键字,直接添加字段if (key_word != ""){foreach (var fa in list_field_attribute){Arcpy.AddField(ob, fa[0], fa[2], fa[1], int.Parse(fa[3]));}}else{// 如果含有关键字,筛选出含关键字的部分,再添加字段if (target_name.Contains(key_word)){foreach (var fa in list_field_attribute){Arcpy.AddField(ob, fa[0], fa[2], fa[1], int.Parse(fa[3]));}}}}
以上便是工具实现的核心代码。
三、工具文件分享
我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:
【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。
相关文章:

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段
在工作中可能会遇到这样的场景:有多个GDB要素、表格,或者是SHP文件,需要给这个要素或表添加相同的多个字段。 在这种情况下,手动添加就变得很繁琐,于是就做了这个工具。 需求具体如下图: 左图是待处理数据…...

CentOS7.3 安装 docker
亲测、截图 阿里云服务器 文章目录 更新源2345 启动开机自启 更新源 sudo yum update -y2 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 sudo yum …...
代码随想录算法训练营第五十二天 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
文章目录 一、300.最长递增子序列二、674.最长连续递增序列三、718.最长重复子数组 一、300.最长递增子序列 题目链接 代码如下: class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<…...

1、Tomcat
java介绍 Java语言和平台由以下几个主要部分组成: 1、Java编程语言(Java Language):这是Java的核心部分,包括Java语法、关键字、数据类型、运算符、控制结构等。程序员使用Java语言来编写应用程序的源代码。 2、Java开发工具包(Java Developm…...
centos 内网实现mail发送
文章目录 1、frp 穿透公网和内网2、邮件 配置2.1、mail配置文件 3、测试 1、frp 穿透公网和内网 参考地址:https://zhaosongbin.blog.csdn.net/article/details/88865890 frps端部署在内网,frpc端部署在外网 frps端配置和上面文章中的一样,…...

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别2
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

如何用C#实现上位机与下位机之间的Wi-Fi通信?
有IP协议支持的话用UDP报文或者TCP直接发IP地址和端口不行么?你说的WiFi难道是2.4GHz频率模块那种东东? 你既然用了wifi,那么只要上位机和下位机的对应wifi网卡都具有ip地址以及其协议支持,那么和网络编程没啥子明显区别的吧………...

学习笔记|大模型优质Prompt开发与应用课(二)|第五节:只需3步,优质Prompt秒变应用软件
原作者:依依│百度飞桨产品经理 一乔│飞桨开发者技术专家 分享内容 01:大模型应用简介 02:LLM应用开发范式 03: Al Studio大模型社区 04:AI对话类应用开发技巧 大模型技术爆发,各类应用产品涌现 文心产业级知识增强大模型 工作中的“超级助手”—…...
VB客运中心汽车售票管理系统设计与实现
摘 要:该系统是信息管理系统在售票管理方面的一个分支和具体运用,是为长治客运中心而设计的管理售票、车次、票价及客票收入统计等日常事物的系统。此系统选择Visual Basic 6.0作为开发工具来实现客运中心汽车售票所要求的各种功能。本文主要介绍了开发此管理系统的背景、必要…...

计算机网络——学习笔记
付费版:直接在上面的CSDN资源下载 免费版:https://wwsk.lanzouk.com/ijkcj13tqmyb 有疑问或者错误的地方可以在评论区指出,我会尽快回复 示例图:...

JSON对象
目录 简介 创建对象 编辑json对象作为属性值 json用于交换数据 简介 json:javascript object notation(js标记对象)是一种轻量化的数据交换模式,特点:体积小,数据量大 在js中,json是以对象的形式存在的&#x…...

26 用lsqnonlin求解最小二乘问题(matlab程序)
1.简述 函数语法 x lsqnonlin(fun,x0) 函数用于: 解决非线性最小二乘(非线性数据拟合)问题 解决非线性最小二乘曲线拟合问题的形式 变量x的约束上下限为ub和lb, x lsqnonlin(fun,x0)从x0点开始,找到fun中描述的函数的最小平方和。函数fu…...

Verilog语法学习——LV6_多功能数据处理器
LV6_多功能数据处理器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a…...
发送信息----策略模式
发送信息----策略模式 发送信息 发送信息 发送信息到手机、邮箱等,可扩展 package mainimport ("errors""fmt" )type PushContext struct {Phone, Email, Message stringTage int }type PaymentStrategy interface {Push(*P…...

PySpark介绍与安装
Spark是什么 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、…...

细讲TCP三次握手四次挥手(三)
TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议,而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件(英语:Internet Pr…...
vue 组件中 data 为什么必须是函数
在Vue组件中,data选项为什么必须是函数而不是对象的原因是为了确保每个组件实例都拥有独立的数据副本。 当data选项是一个对象时,如果你有多个相同组件的实例,它们会共享同一个对象引用,这意味着一个组件的数据变化会影响到其他相…...

从零开始学python(十二)如何成为一名优秀的爬虫工程师
前言 回顾之前讲述了python语法编程 必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习,全栈开发,数据分析前面没看的也不用往…...

为高性能计算构建,由亚马逊云科技Amazon Graviton3E驱动的最新实例正式可用
亚马逊云科技宣布两款基于最新一代自研芯片Amazon Graviton3E的新实例Amazon Elastic Compute Cloud(Amazon EC2)Hpc7g和Amazon EC2 C7gn正式可用。 其中,Hpc7g实例专为计算和网络密集型高性能计算(HPC)工作负载而构建…...
BUUCTF题目Crypto部分wp(持续更新)
Url编码 题目密文是%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d,根据题目名字使用python的urllib模块解码即可。flag{and 11} from urllib.parse import quote, unquotec r%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d m unquote(c, encodingutf-8) print(m)c2 quot…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...