【ArcGIS Pro二次开发】(22):生成分级用地编码和名称

2024-01-09 20:59

本文主要是介绍【ArcGIS Pro二次开发】(22):生成分级用地编码和名称,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在国土空间规划中,用地用海分类采用三级分类体系,共设置24种一级类、106种二级类及39 种三级类。在某些场景中,需要按等级归类并汇总统计。

这个小工具的作用就是通过用地编码生成三级地类,作为后续统计的基础。


一、要实现的功能

如上图所示,右键点击地图中的要素图层,点击【生成分级用地用海】按钮,打开工具框,选择图层的用地编码字段、分级类型和是否生成名称,点击运行即可。

其中分级类型中,如果选【大类】,会生成新字段【大类编码】;选【中类】,则会生成新字段【大类编码、中类编码】,以此类推。

如果勾选【是否生成用地用海名称】,则会根据编码字段,生成名称字段。

例如,你选择【中类】,并勾选【是否生成用地用海名称】,要素图层会新生成【大类编码、大类名称、中类编码、中类名称】4个字段,并分别计算它们的字段值。

运行结果如下图:


二、实现流程

1、创建ProWindow工具框并设置参数框的内容

创建一个ProWindow工具框,具体做法参看之前的文章:

【ArcGIS Pro二次开发】(13):ProWindow的用法

将当前选择的要素图层加入参数框:

// 获取当前选择的要素图层
FeatureLayer initlayer = MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
// combox_fc框中添加当前选择的要素图层
combox_fc.Items.Add(initlayer);
combox_fc.SelectedIndex = 0;

将当前选择要素图层的所有字段添加到combox中,以用于手动选择字段:

            // 清空combox_fieldcb.Items.Clear();await QueuedTask.Run(async () =>{// 获取所选图层的所有字段var fields = initlayer.GetFieldDescriptions();foreach (var field in fields){await QueuedTask.Run(() =>{// 在UI线程上执行添加item的操作Application.Current.Dispatcher.Invoke(() =>{// 将所有字段名添加到combox_field中cb.Items.Add(field.Name);});});}});

用地用海分级中加入3种模式,并将其中1种设为默认:

// combox_model框中添加3种模式,默认【大类】
combox_model.Items.Add("大类");
combox_model.Items.Add("中类");
combox_model.Items.Add("小类");
combox_model.SelectedIndex = 0;

2、主要流程代码

这里我把工作的主要流程整理了一下,将其中部分会重复使用的代码写成方法,这样看上去流程会更加清晰:

            // 参数获取string fcPath = combox_fc.Text;string bmField = combox_field.Text;// 模式转换int model = 1;if (combox_model.Text == "中类") { model = 2; }else if (combox_model.Text == "小类") { model = 3; }// 根据需求生成三级用地编码和名称if (model >= 1){AddField(fcPath, "大类编码", "TEXT");     // 添加大类编码GetBM1(fcPath, bmField, "大类编码");                // 计算大类编码if (checkbox_isMC.IsChecked == true){AddField(fcPath, "大类名称", "TEXT");     // 添加大类名称YDYHChange(fcPath, "大类编码", "大类名称");    // 编码转名称}}if (model >= 2){AddField(fcPath, "中类编码", "TEXT");     // 添加中类编码GetBM2(fcPath, bmField, "中类编码");                // 计算中类编码if (checkbox_isMC.IsChecked == true){AddField(fcPath, "中类名称", "TEXT");     // 添加中类名称YDYHChange(fcPath, "中类编码", "中类名称");    // 编码转名称}}if (model >= 3){AddField(fcPath, "小类编码", "TEXT");     // 添加小类编码GetBM3(fcPath, bmField, "小类编码");                // 计算小类编码if (checkbox_isMC.IsChecked == true){AddField(fcPath, "小类名称", "TEXT");     // 添加小类名称YDYHChange(fcPath, "小类编码", "小类名称");    // 编码转名称}}

流程比较清晰(只是水平有限,这多重if确实挺难看的),根据【分级类型】和【是否生成用地用海名称】来判断生成的新字段,并进行计算。

在此之前,将分级类型转成整型方便判断。

整合的方法包括【添加字段、计算各级用地编码字段、通过用地用海转换实现编码转名称】。

3、【添加字段】

添加字段比较简单,调用一下GP工具就可以了:

var par_AddField = Geoprocessing.MakeValueArray(fcPath, fieldName, fieldType, null, null, fieldLength, fieldAlias, null, null, null);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.AddField", par_AddField, null, null, null, executeFlags));

4、【计算各级用地编码字段】

计算字段主要通过打开要素图层的属性表并进行编辑来实现,之前有写过这方面的内容,可以复习一下:

【ArcGIS Pro二次开发】(10):属性表字段(field)的修改

以提取编码大类为例,通过Substring()方法提取前2位文字,主要代码如下:

            await QueuedTask.Run(() =>{// 打开要素图层的表格var table = initlayer.GetTable();// 定位到属性表的游标using (var tableCursor = table.Search(null, false)){while (tableCursor.MoveNext()){// 获取当前记录的值var row = tableCursor.Current;string currentValue = row[fieldBefore] as string;// 获取fieldBefore字段值的前两位string newValue = currentValue.Substring(0, 2);// 更新字段值row[fieldAfter] = newValue;row.Store();}}});

提取中类和小类则再复杂一点,加个if判断一下即可:

                        // 取值默认为空string newValue = "";// 如果原字段值超过4位,获取fieldBefore字段值的前4位if (currentValue.Length >= 4){newValue = currentValue.Substring(0, 4);}

5、【通过用地用海转换实现编码转名称】

这部分我已经专门发过文章,并且已经做成工具,直接使用即可:

【ArcGIS Pro二次开发】(15):用地用海名称和代码互转

简单就可实现用地编码转换为用地名称。

PS:综上,整个工具的代码量虽然算比较多,但其实大部分都在之前文章中写过,我把之前的一些方法都写到一个.cs文件中,基本就是引用即可。

因此本文中很多代码没有放出来,不过文章末尾会提供工程文件下载,可以自行查看全部代码。

如果你是新手,并且没看过我之前的相关文章,建议按上面的链接好好回看一下,不然可能会看得云里雾里。


三、工程文件分享

 最后,放上工程文件的链接:

CreateGdYDYHicon-default.png?t=N2N8https://pan.baidu.com/s/1BPvmCxWGCJqg_9UOnj30Pw?pwd=sz4b

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

这篇关于【ArcGIS Pro二次开发】(22):生成分级用地编码和名称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/588416

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre