当前位置: 首页 > news >正文

【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的用法icon-default.png?t=O83Ahttps://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工具和自定义工具的调用icon-default.png?t=O83Ahttps://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二次开发实例教程】原代码合集icon-default.png?t=O83Ahttps://pan.baidu.com/s/1HuS7engSHi1uK1sl70xtAQ?pwd=d6ji

相关文章:

【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值

一、简介 一般的数据库要素或表格都有一个BSM字段&#xff0c;用来标识唯一值。 此工具要实现的功能是&#xff1a;按一定的规律&#xff08;前缀中间的填充数字OBJECT码&#xff09;来给BSM赋值。 主要技术要点包括&#xff1a; 1、ProWindow的创建&#xff0c;Label,Comb…...

OpenCV轮廓相关操作API (C++)

在OpenCV中&#xff0c;轮廓&#xff08;contours&#xff09;是图像处理中的一个重要概念&#xff0c;通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API&#xff0c;可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…...

[开源]自动化定位建图系统

系统状态机&#xff1a; 效果展示&#xff1a; 1、 机器人建图定位系统-基础重定位&#xff0c;定位功能演示 2、 机器人建图定位系统-增量地图构建&#xff0c;手动回环检测演示 3、敬请期待… 开源链接&#xff1a; 1、多传感器融合里程计 https://gitee.com/li-wenhao-lw…...

linux ansible部署

ansible部署完后&#xff0c;执行报错 # 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.枚举的定义和使用如下图所示&#xff1a; 定义时还可以给枚举的成员指定数据类型&#xff0c;例如&#xff1a;enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下&#xff0c;使用::进行分隔。 2.一个特殊的枚举Option&#xff0…...

Redis内存碎片

什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子&#xff1a;操作系统为你分配了 32 字节的连续内存空间&#xff0c;而你存储数据实际只需要使用 24 字节内存空间&#xff0c;那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数…...

Express 加 sqlite3 写一个简单博客

例图&#xff1a; 搭建 命令&#xff1a; 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…...

正则表达式进阶学习(一):环视、捕获分组与后向引用

一、环视&#xff08;零宽断言&#xff09; 理论部分 环视&#xff08;零宽断言&#xff09;是一种用于匹配位置而非字符的正则表达式技术。它的核心特点是&#xff1a;不消耗字符&#xff0c;只检查某个位置前后是否符合特定的条件。可以理解为&#xff0c;环视是在匹配前“…...

《Vue3 七》插槽 Slot

插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽&#xff1a; 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装&#xff1b;将不同的元素使用 slot 作为占位&#xff0c;让外部决定到底显示什么样的…...

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...

Linux C/C++编程-获得套接字地址、主机名称和主机信息

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (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(“…...

力扣 跳跃游戏

每次更新目标位置时&#xff0c;实际上是在做一个局部的最优选择&#xff0c;选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时&#xff0c;都是基于当前能跳跃到的最远位置&#xff0c;因此最终的结果是全局最优的。 题目 从前往后遍历&#xff0c;更新可以到…...

使用npm 插件[mmdc]将.mmd时序图转换为图片

使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc &#xff08;Mermaid CLI&#xff09;这个工具来将 .mmd 时序图&#xff08;Mermaid语法描述的时序图&#xff09;转换为图片&#xff0c;以下是使用步骤&#xff1a; 1. 安装 mmdc 确保…...

ffmpeg 常用命令

更详细请参考ffmpeg手册&#xff0c;下载ffmpegrelease版后在doc中就有&#xff0c;主页面。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函数&#xff08;从新手角度逐步升级改进&#xff09;1. 基础版本&#xff08;利用循环计数&#xff09;2. 改进版本&#xff08;利用指针相减&#xff09;3. 递归版本&#xff08;利用递归思…...

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …...

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)

学习了十种常见的排序方法&#xff0c;此文章针对所学的排序方法进行整理&#xff08;通过C语言完成排序&#xff09;。 参考内容&#xff1a; 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是一种革命性的 全双工通信协议 &#xff0c;构建在TCP之上&#xff0c;旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接&#xff0c;WebSocket实现了真正的双向实时通信&#xff0c;显著提高了交互效率。这一特性…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...