【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值
一、简介
一般的数据库要素或表格都有一个BSM字段,用来标识唯一值。
此工具要实现的功能是:按一定的规律(前缀+中间的填充数字+OBJECT码)来给BSM赋值。
主要技术要点包括:
1、ProWindow的创建,Label,Combobox,Button控件的使用
2、获取当前内容框的所有要素图层
3、获取指定要素图层的所有字段
4、使用GP工具来进行【字段计算】
二、前端
1、ProWindo窗口的搭建
创建一个ArcGIS Pro模块加载项。
在项目中,右键点击【项目】-【新建项】,添加1个【ArcGIS Pro ProWindow】,命名为【SetBSMCode.xaml】。

添加后会生成3个文件。
【SetBSMCode.xaml】是ProWindow的前端配置文件,用来搭建工具窗口。
【SetBSMCode.xaml.cs】是ProWindow的后端文件,用来处理各种后端事件。
【ShowSetBSMCode.cs】是一个Button按钮,点击后即可显示ProWindow窗口。

打开【SetBSMCode.xaml】,会发现其实就是一个WPF窗口。
关于ProWindow的基本操作方法可以看一下这个文章。
ProWindow的用法
https://blog.csdn.net/xcc34452366/article/details/129552432这里介绍了几个常用控件的使用方法。我们这次用到的只有【Label、ComboBox、Button、TextBox】。
搭建窗口如下:

然后为控件【cb_layer、cb_field、btn_go】设置一下事件,进行前后端的连接。



2、Config.daml设置
【Config.daml】的设置可以参照上一期教程,主要就是Button控件【ShowSetBSMCode.cs】的设置,这里就不再缀述:
注意Button图片要放在工程里,并将【生成操作】设置为【内容】。

点击调试,查看结果:

三、后端
打开【SetBSMCode.xaml.cs】,可以看到,已经有了3个空的事件方法。

1、【cb_layer_DropOpen】将当前地图中的所有要素图层添加到ComboBox中
首先清空ComboBox里的下拉项,避免之前操作的遗留。
通过map的【GetLayersAsFlattenedList()】方法获取当前地图中的所有要素图层,注意这部分代码要放在【QueuedTask.Run()】里面。
再把图层名逐个加入到ComboBox的下拉项。
这样当【cb_layer】下拉时,下拉框里就是显示所有的图层名。
private async void cb_layer_DropOpen(object sender, EventArgs e)
{// 先清空ComboBox里的下拉项,避免之前操作的遗留cb_layer.Items.Clear();// 获取当前地图Map map = MapView.Active.Map;// 获取所有要素图层List<FeatureLayer> featureLayers = await QueuedTask.Run(() =>{return map.GetLayersAsFlattenedList().OfType<FeatureLayer>().ToList();});// 把图层的名称以文本格式添加到ComboBox的下拉项foreach (FeatureLayer featureLayer in featureLayers){cb_layer.Items.Add(featureLayer.Name);}
}
2、【cb_field_DropOpen】将上面选择图层的所有字段名添加到ComboBox中
首先要清空ComboBox里的下拉项,避免之前操作的遗留。
获取【cb_layer】中选定的图层名,并通过图层名来获取要素图层FeatureLayer要素。
最后再将要素图层的名称加入到ComboBox的下拉项。
同样要注意的是哪一部分代码在放在【QueuedTask.Run()】里面。
private async void cb_field_DropOpen(object sender, EventArgs e)
{// 获取cb_layer中选定的图层名string lyName = cb_field.Text;// 清空combox_fieldcb_field.Items.Clear();var fields = await QueuedTask.Run(() =>{// 获取当前地图Map map = MapView.Active.Map;// 通过图层名获取对应的要素图层FeatureLayerFeatureLayer featureLayer = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(l => l.Name == lyName);// 获取所选图层的所有字段return featureLayer.GetTable().GetDefinition().GetFields().ToList();});// 将所有字段名添加到combox_field中foreach (var field in fields){cb_field.Items.Add(field.Name);}
}
3、【btn_go_Click】执行主程序
工具的核心代码放在这里。
一般这里的代码都比较长,也是问题频发区。我的习惯是直接在外面套一个【try...catch】用来捕捉错误。
try
{// TODO
}
catch (Exception ee)
{MessageBox.Show(ee.Message + ee.StackTrace);return;
}
具体流程如下:
先获取工具窗口里设置好的参数:图层名,字段名,前缀文字。
再获取图层的OID字段和BSM字段。
需要特别说明的是,这里只是一个简单的示例,先不考虑SHP数据的情况。
不过即使是GDB数据,它的OID字段也并不一定就是【objectID】,也可能是【objectID_1】等其它情况,所以这里需要重新查找,通过字段类型来确定OID字段。
获取到OID字段的名称和BSM字段的长度后,再使用GP工具来执行【计算字段】,得到最终结果。
有关GP工具的使用请查看这个文章:
GeoProcessing工具和自定义工具的调用
https://blog.csdn.net/xcc34452366/article/details/129225381?spm=1001.2014.3001.5501执行完毕后,就关闭工具窗口,并弹出一个Message框,提示完成。
全代码如下:
private async void btn_go_Click(object sender, RoutedEventArgs e)
{try{// 图层名string layerName = cb_layer.Text;// 字段名string fieldName = cb_field.Text;// 前缀文字string front = txt_front.Text;await QueuedTask.Run(() =>{// 搜索OID字段和BSM字段Field OIDField = null;Field BSMField = null;// 获取当前地图Map map = MapView.Active.Map;// 通过图层名获取对应的要素图层FeatureLayerFeatureLayer featureLayer = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(l => l.Name == layerName);// 获取所选图层的所有字段var fields = featureLayer.GetTable().GetDefinition().GetFields().ToList();foreach (var field in fields){// 通进OID字段的类型来搜索if (field.FieldType == FieldType.OID){OIDField = field;}// 通进BSM字段的名称来搜索if (field.Name == fieldName){BSMField = field;}}// 获取OID字段的名称和BSM字段的长度string OIDName = OIDField.Name;int BSMLength = BSMField.Length;// 计算字段的计算表达式string block = $"'{front}'+'0' * ({BSMLength} - len(str(!{OIDName}!+1))-{front.Length}) + str(!{OIDName}!)";// 生成计算字段工具所需的参数var par = Geoprocessing.MakeValueArray(layerName, fieldName, block);// 执行计算字段工具Geoprocessing.ExecuteToolAsync("management.CalculateField", par);});// 关闭窗口Close();// 弹出一个Message框,提示完成MessageBox.Show("BSM修改完成");}catch (Exception ee){MessageBox.Show(ee.Message + ee.StackTrace);return;}
}
四、调试
点击调试,如图所示,选定【图层2】,字段选定【BSM】,前缀输入一个【350001】,点击【运行】
:

运行后打开图层属性表:

需要说明的是,这个工具只是个示例,有很多特殊情况还没有考虑进去,如SHP的OID字段值是从0开始而不是从1开始等。
作为一个初级教程,还是尽量先从简单的情况开始,优先考虑完成主要功能,在后面的教程中会慢慢深入。
五、工程文件下载
工程文件地址如下,在文件夹中找到【BSM字段赋值】下载即可。
【ArcGIS Pro二次开发实例教程】原代码合集
https://pan.baidu.com/s/1HuS7engSHi1uK1sl70xtAQ?pwd=d6ji
相关文章:
【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值
一、简介 一般的数据库要素或表格都有一个BSM字段,用来标识唯一值。 此工具要实现的功能是:按一定的规律(前缀中间的填充数字OBJECT码)来给BSM赋值。 主要技术要点包括: 1、ProWindow的创建,Label,Comb…...
OpenCV轮廓相关操作API (C++)
在OpenCV中,轮廓(contours)是图像处理中的一个重要概念,通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API,可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…...
[开源]自动化定位建图系统
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、敬请期待… 开源链接: 1、多传感器融合里程计 https://gitee.com/li-wenhao-lw…...
linux ansible部署
ansible部署完后,执行报错 # ansible one -i hosts -m ping dataos193 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add …...
《Rust权威指南》学习笔记(二)
枚举enum 1.枚举的定义和使用如下图所示: 定义时还可以给枚举的成员指定数据类型,例如:enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下,使用::进行分隔。 2.一个特殊的枚举Option࿰…...
Redis内存碎片
什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数…...
Express 加 sqlite3 写一个简单博客
例图: 搭建 命令: 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…...
正则表达式进阶学习(一):环视、捕获分组与后向引用
一、环视(零宽断言) 理论部分 环视(零宽断言)是一种用于匹配位置而非字符的正则表达式技术。它的核心特点是:不消耗字符,只检查某个位置前后是否符合特定的条件。可以理解为,环视是在匹配前“…...
《Vue3 七》插槽 Slot
插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽: 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装;将不同的元素使用 slot 作为占位,让外部决定到底显示什么样的…...
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...
Linux C/C++编程-获得套接字地址、主机名称和主机信息
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…...
USB kbtab linux 驱动代码
#include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> #include <asm/unaligned.h> /* Pressure-threshold modules param code from */MODULE_AUTHOR(“xxx”); MODULE_DESCRIPTION(“…...
力扣 跳跃游戏
每次更新目标位置时,实际上是在做一个局部的最优选择,选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时,都是基于当前能跳跃到的最远位置,因此最终的结果是全局最优的。 题目 从前往后遍历,更新可以到…...
使用npm 插件[mmdc]将.mmd时序图转换为图片
使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc (Mermaid CLI)这个工具来将 .mmd 时序图(Mermaid语法描述的时序图)转换为图片,以下是使用步骤: 1. 安装 mmdc 确保…...
ffmpeg 常用命令
更详细请参考ffmpeg手册,下载ffmpegrelease版后在doc中就有,主页面。video filter 参考ffmpeg-filters.html -version -formats -demuxers -protocols -muxers -filters -devices —pix_fmts -codecs -sample_fmts -decoders -layouts -encoders -colors…...
从入门到实战:C 语言 strlen 函数通关指南
文章目录 一、strlen函数简介1. 函数构成2. 参数说明3. 使用示例 二、模拟实现strlen函数(从新手角度逐步升级改进)1. 基础版本(利用循环计数)2. 改进版本(利用指针相减)3. 递归版本(利用递归思…...
npm install --global windows-build-tools --save 失败
注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …...
十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。 参考内容: https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…...
基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...
实现websocket心跳检测,断线重连机制
WebSocket基础 WebSocket概念 WebSocket是一种革命性的 全双工通信协议 ,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
