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

news/2025/1/8 6:00:38/

一、简介

一般的数据库要素或表格都有一个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


http://www.ppmy.cn/news/1561199.html

相关文章

使用Python实现健康跟踪应用:打造智能健康管理助手

随着人们对健康的关注日益增强,智能健康管理逐渐成为热门趋势。通过持续跟踪身体状况、饮食、运动和睡眠等方面的数据,我们可以更好地了解自己的健康状态,并采取相应的措施来保持身体健康。Python,作为一种简洁且功能强大的编程语言,非常适合用来开发健康跟踪应用。本文将…

哈希表笔记

教程来自代码随想录 哈希表笔记 什么时候使用哈希法&#xff1a;当我们需要查询一个元素是否出现过&#xff0c;或者一个元素是否在集合里的时候 重点是在于如何转化查找的问题 有效的字母异位词 leetcode242 用对应和–判断 bool isAnagram(string s, string t) {if(s.l…

基于python的网络爬虫爬取天气数据及可视化分析(Matplotlib、sk-learn等,包括ppt,视频)

基于Python爬取天气数据信息与可视化分析&#xff08;文末完整源码&#xff09; 基于python的网络爬虫爬取天气数据及可视化分析 可以看看演示视频。 摘要 基于Python爬取天气数据信息与可视化分析 本论文旨在利用Python编程语言实现天气数据信息的爬取和可视化分析。天气…

Objective-C 是一种面向对象的编程语言

Objective-C 是一种面向对象的编程语言,主要用于苹果公司的操作系统 iOS 和 macOS 的开发。以下是关于 Objective-C 的介绍: 一、历史与发展 Objective-C 是在 20 世纪 80 年代初由 Brad Cox 和 Tom Love 开发的。它是 C 语言的超集,添加了面向对象编程的特性。Objective-…

使用Oracle的Debian软件包在Linux上安装MySQL

Oracle提供Debian软件包&#xff0c;用于在Debian或类似Debian的Linux系统上安装MySQL。这些软件包可通过两种不同的渠道获得&#xff1a; 1、从MySQLAPT存储库。这是在类Debian系统上安装MySQL的首选方法&#xff0c;因为它提供了一种简单方便的方式来安装和更新MySQL产品。 …

【vLLM】使用PagedAttention 进行大型语言模型的高效内存管理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案&#xff0c;旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能&#xff0c;如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好&#xff0c;让用户能够轻松选择所需的商品或服务&…

springCloud实战

一、Feign的实战 1、使用 1.1步骤 ①引入feign依赖 ②在启动类上加上EnableFeignClients注解&#xff0c;开启Feign客户端 ③编写FeignClient接口 1.2开启feign调用日志 只需在yml配置文件中开启配置即可 feign:client:default:loggerLevel: FULL #feign接口被调用时的…