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

news2025/1/8 16:17:45

一、简介

一般的数据库要素或表格都有一个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_field
    cb_field.Items.Clear();

    var fields = await QueuedTask.Run(() =>
    {
        // 获取当前地图
        Map map = MapView.Active.Map;

        // 通过图层名获取对应的要素图层FeatureLayer
        FeatureLayer 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;
            // 通过图层名获取对应的要素图层FeatureLayer
            FeatureLayer 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.coloradmin.cn/o/2272687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ros2笔记-2.5.3 多线程与回调函数

本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件&#xff0c;learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程&#xff1a;{threading.get_ident()} 开始下载&#xff1a;{…

C语言练习:求数组的最大值与最小值

文章目录 1. 提出任务2. 完成任务2.1 方法一&#xff1a;通过返回结构体指针来间接返回结果2.1.1 编写程序&#xff0c;实现功能2.1.2 运行程序&#xff0c;查看结果 2.2 方法二&#xff1a;通过参数传递数组&#xff0c;并在函数中修改传入的参数2.2.1 编写程序&#xff0c;实…

conda安装及demo:SadTalker实现图片+音频生成高质量视频

1.安装conda 下载各个版本地址&#xff1a;https://repo.anaconda.com/archive/ win10版本&#xff1a; Anaconda3-2023.03-1-Windows-x86_64 linux版本&#xff1a; Anaconda3-2023.03-1-Linux-x86_64 Windows安装 环境变量 conda -V2.配置conda镜像源 安装pip conda…

【前端系列01】优化axios响应拦截器

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios响应拦截器&#xff1a;☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 这个系列可…

PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”

近日&#xff0c;全球 IT 市场研究和咨询公司 Gartner 发布最新报告《Magic Quadrant™ for Cloud Database Management Systems》&#xff08;云数据库管理系统魔力象限&#xff09;&#xff0c;PingCAP 因其企业级开源分布式数据库 TiDB 在全球市场的表现&#xff0c;连续两年…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程&#xff1a; 6.机器学习课程&#xff08;六&#xff09;支持向量机&#xff08;线性模型&#xff09;问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库&#xff1a;麻烦&#xff0c;要专门去找库&#xff0c;cmak…

idea( 2022.3.2)打包报错总结

一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …

极客说|微软 Phi 系列小模型和多模态小模型

作者&#xff1a;胡平 - 微软云人工智能高级专家 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南

目录 前言1. 分析问题原因2. 解决方案 2.1 修改 IntelliJ IDEA 的 JVM 选项2.2 配置 Tomcat 实例的 VM 选项 2.2.1 设置 Tomcat 的 VM 选项2.2.2 添加环境变量 3. 进一步优化 3.1 修改 Tomcat 的 logging.properties3.2 修改操作系统默认编码 3.2.1 Windows 系统3.2.2 Linux …

某小程序sign签名参数逆向分析

文章目录 1. 写在前面2. 接口分析3. 分析还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件

3D Slicer 是一款功能全面的开源医学影像分析软件&#xff0c;广泛应用于影像处理、三维建模、影像配准和手术规划等领域。它支持多种医学影像格式&#xff08;如 DICOM、NIfTI&#xff09;和丰富的插件扩展&#xff0c;是神经科学、放射学和生物医学研究中不可或缺的工具。 在…

Linux系统安装es详细教程

一、下载es及插件 从下面的网址进行对应es版本的下载https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz &#xff0c;想要不同版本的es只需更换对应的版本号即可。 插件下载地址&#xff08;ik分词器、pinyin等&#xff09;es…

电子电气架构 --- 汽车总线基础介绍

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

安装PyQt5-tools卡在Preparing metadata (pyproject.toml)解决办法

为了在VS code中使用PyQt&#xff0c;在安装PyQt5-tools时总卡在如下这一步 pyqt5 Preparing metadata (pyproject.toml)经过各种尝试&#xff0c;最终问题解决&#xff0c;在此记录方法。 首先进入PyQt5-tools官网查看其适配的Python版本&#xff0c;网址如下&#xff1a; h…

38 Opencv HOG特征检测

文章目录 HOGDescriptor 构造函数setSVMDetector 设置支持向量机&#xff08;SVM&#xff09;检测器&#xff0c;用于目标检测。compute 用于计算图像区域的HOG描述符。detectMultiScale 多尺度检测目标。示例 HOGDescriptor 构造函数 HOGDescriptor(); HOGDescriptor(const S…

分布式搜索引擎之elasticsearch基本使用3

分布式搜索引擎之elasticsearch基本使用3 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&…

人工智能知识分享第九天-机器学习_集成学习

集成学习 概念 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器&#xff08;基学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知的样本进行预测时…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…