【ArcGIS Pro二次开发】(23):用地编码和用地名称的规范性检查

news2024/9/23 5:15:11

在国空或村庄规划的编制过程中,随着规划用地的调整,经常会手动修改用地编码和用地名称,不可避免的会出现错误,如果单靠人工校对,累人又不能保证准确性。这个工具的目的就是检查用地编码和用地名称是否规范,二者是否一一对应。


一、要实现的功能

如上图所示,右键点击地图中的要素图层,点击【检查用地用海字段】按钮,打开工具框,选择图层的用地编码字段和用地名称字段,点击运行即可。

运行结果如下图:

要素会新增一个【用地用海检查】字段,用地编码和用地名称的规范性错误会列在字段里。


二、实现流程

创建ProWindow工具框等基础功能可以参看往期文章,这里只把实现核心功能的流程列举出来。

1、通过嵌入的Excel资源文件获取用地用海分类

在往期的文章用到一种方法,使用【字典(Dictionary)创建表格(Table)】来获取用地用海分类。这个方法有点麻烦,需要编辑字典,遇上复杂的表格不好操作。

这里采用另一个方法,使用嵌入式的文件的方式,直接从Excel文件中读取。

首先需要将Excel文件的生成操作设置为【嵌入的资源】,然后从资源中读取。

我这里不采用直接读取的方式,为了保险一点(可能没有必要),先把资源里的文件复制到本地,再从本地读取,代码如下:

            // 复制资源文件
            string folder = Project.Current.HomeFolderPath;
            string excelPath = @"用地用海_DM_to_MC.xlsx";
            string outputPath = System.IO.Path.Combine(folder, excelPath);  
            string resourceName = @"CheckFieldYDYH." + excelPath;    

            // 获取当前程序集的实例
            Assembly assembly = Assembly.GetExecutingAssembly();
            // 从嵌入资源中读取文件
            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            {
                // 创建目标文件
                using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
                {
                    // 将文件从嵌入资源复制到目标文件
                    stream.CopyTo(outputPath );
                }
            }

在这个案例中,我们要读取Excel文件的内容是第一列和第二列的值,并将其输出成一个字典(Dictionary)即可。

代码如下:

            // 建立 Excel 应用程序对象
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            // 打开 Excel 文件
            Workbook workbook = excelApp.Workbooks.Open(excelPath);
            // 获取工作表
            Worksheet worksheet = workbook.Worksheets[1];
            // 定义字典
            Dictionary<string, string> dict = new Dictionary<string, string>();
            // 获取Excel表格中的数据
            for (int row = 1; row <= worksheet.UsedRange.Rows.Count; row++)
            {
                string key = worksheet.Cells[row, col1].Value.ToString();
                string value = worksheet.Cells[row, col2].Value.ToString();
                dict.Add(key, value);
            }
            //  保存并关闭 Excel 文件和应用程序对象
            workbook.Close(true);
            excelApp.Quit();

至此,就实现了从Excel资源文件中读取数据并输出为字典(Dictionary)。

2、将目标字段值中的空值【null】转换为【空字符串】

下一步正常就该开始编辑属性表,但为了保证数据计算安全,这里再做了一件事,将2个目标字段值中的空值【null】转换为【空字符串】,这也是被空值坑过多次之后,我现在几乎都会做这个预处理。代码如下:

            // 获取所选图层的所有字段
            var fields = await QueuedTask.Run(() =>
            {
                return initlayer.GetFieldDescriptions();
            });

            // 使用异步任务在后台进行编辑操作
            await QueuedTask.Run(() =>
            {
                // 打开要素图层的表格
                var table = initlayer.GetTable();
                // 定位到属性表的游标
                using (var tableCursor = table.Search(null, false))
                {
                    while (tableCursor.MoveNext())
                    {
                        // 获取当前记录的值
                        var row = tableCursor.Current;
                        // 历数所有字段
                        foreach (var field in fields)
                        {
                            // 排除不可编辑的字段
                            if (field.IsReadOnly == false)
                            {
                                // 如果是字符串类型,则进行下一步
                                if (field.Type == FieldType.String)
                                {
                                    var currentValue = row[field.Name];
                                    if (currentValue is null)
                                    {
                                        currentValue = "";
                                    }
                                    // 更新该字段的值
                                    row[field.Name] = currentValue;
                                    row.Store(); // 保存修改
                                }
                            }
                        }
                    }
                }
            });

3、新建检查字段,并通过属性表编辑计算字段值

新建一个【用地用海检查】字段,打开当前选择的的要素图层的属性表进行编辑。

计算逻辑如下:

1)分别针对2个字段,通过【new List<string>(dict.Keys).Contains(bm)】判断该字段值是否在用地用海分类的规范命名范围内,如果不在范围内,刚输出错误信息。

2)如果2个字段都满足规范,则通过【dict[bm.ToString()] != mc.ToString()】判断用地编码和用地名称是否一一对应,如果有误,则输出错误信息。

3)最后给【用地用海检查】字段赋值即可。

            // 使用异步任务在后台进行编辑操作
            await QueuedTask.Run(() =>
            {
                // 打开要素图层的表格
                var table = initlayer.GetTable();
                // 定位到属性表的游标
                using (var tableCursor = table.Search(null, false))
                {
                    while (tableCursor.MoveNext())
                    {
                        // 获取当前记录的值
                        var row = tableCursor.Current;
                        var bm = row[bm_field];
                        var mc = row[mc_field];
                        // 定义错误信息文字
                        string err = "";
                        // 设置一个flag:是否符合规范
                        bool isOK = true;
                        // 检查编码字段
                        if (new List<string>(dict.Keys).Contains(bm) == false)
                        {
                            err += "BM错误;";
                            isOK = false;
                        }
                        // 检查名称字段
                        if (new List<string>(dict.Values).Contains(mc) == false)
                        {
                            err += "MC错误;";
                            isOK = false;
                        }
                        // 检查编码和名称是否一一对应
                        if (isOK)
                        {
                            if (dict[bm.ToString()] != mc.ToString())
                            {
                                err += "BM和MC不匹配";
                            }
                        }
                        // 检查字段赋值
                        row["用地用海检查"] = err;
                        row.Store();
                    }
                    this.Close();
                    MessageBox.Show("字段值更新完成!");
                }
            });

三、工程文件分享

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

CheckFieldYDYHhttps://pan.baidu.com/s/1aumM78dtntI5an6HVl3owg?pwd=i3qd

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452890.html

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

相关文章

最短路径Floyd与区间DP

floyd算法是求最短路径的算法&#xff0c;算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径&#xff0c;不需要其他运算&#xff0c;使用二维数组存储。其三层循环自外向内分别为&#xff1a;中间点&#xff0c;起始点和终点。状态方程为&#xff1a; num[…

【社区图书馆】《网络工程师的Python之路:网络运维自动化实战(第2版)》

文章目录 图书前言图书简介图书作者、简介图书好评图书目录总结&#xff1a;本人选择此图书的意义 图书前言 光阴似箭&#xff0c;岁月如梭。转眼之间&#xff0c;距离本书最早的电子书出版已经过去了三年之久。承蒙广大读者的厚爱&#xff0c;电子书和第1版纸质书的发行量远远…

【云原生】Java 应用程序在 Kubernetes 上棘手的内存管理

文章目录 引言JVM 内存模型简介非 Heap 内存Heap 堆内存Kubernetes 内存管理JVM 和 Kubernetes场景 1 — Java Out Of Memory 错误场景 2 — Pod 超出内存 limit 限制场景 3 — Pod 超出节点的可用内存场景 4 — 参数配置良好&#xff0c;应用程序运行良好 结语 引言 如何结合…

PCIe-DMA多通道/高性能/超低延时/超低抖动视频采集显示V4L2驱动

1 介绍 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous或Scather GatherDMA&#xff0c;提供fifo/AXI4-Stream用户接口。 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe…

大型体检管理系统源码:适用于大中型医院或独立体检中心

一套专业的体检管理系统源码&#xff0c;是医院、体检中心等单位开展体检业务的得力助手。它将以往人工操作的健康体检过程所得到信息转换成全信息化的电脑管理&#xff0c;使体检过程更为流畅、更有条理&#xff0c;更加便于管理&#xff0c;从而实现体检业务管理的自动化、信…

2023年报考CSM敏捷教练认证好不好?含金量高吗?

CSM&#xff0c;Certified Scrum Master&#xff0c;是Scrum联盟发起的Scrum认证。帮助个人从自身、团队和组织层面&#xff0c;学习技能和工具来扩展实践的层面&#xff0c;帮助团队正确使用Scrum&#xff0c;从而提高项目整体成功的可能性。 认证收益 职业能力提升 推动企业…

AIGC技术周报|为文生图模型提供“参考”;交互式prompt系统:让文生图模型更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 交互式prompt系统&#xff1a;让文生图模型更懂你 文生图…

JVM性能监测工具-JConsole

JVM性能监测工具-JConsole JConsole工具是JDK自带的图形化性能监控工具。并通过JConsole工具&#xff0c; 可以查看Java应用程序的运行概况&#xff0c; 监控堆信息、 元空间使用情况及类的加载情况等。 JConsole程序在%JAVA_HOM E%/bin目录下 或者你可以直接在命令行对他进…

【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代

目录 1、准备条件2、实现方式3、代码环境和maven依赖4、Java代码5、示例1结果6、示例2结果7、一个小问题8、“音乐标签”下载地址 1、准备条件 网易云下载的MP3、flac后缀的歌曲若干首&#xff08;ncm后缀的歌曲需要还原格式&#xff0c;不然会随着VIP过期而无法听&#xff09…

《CTFshow-Web入门》06. Web 51~60

Web 51~60 web51题解 web52知识点题解 web53知识点题解 web54知识点题解 web55知识点题解 web56知识点题解 web57知识点题解 web58知识点题解 web59题解 web60题解 ctf - web入门 web51 题解 相比上一题多过滤了 tac 命令。那换一个即可。 题解&#xff1a; url ?cnl<f…

go/java/C++覆盖率工具原理汇总学习记录

go–goc goc采用的是插桩源码的形式&#xff0c;而不是待二进制执行时再去设置breakpoints。这就导致了当前go的测试覆盖率收集技术&#xff0c;一定是侵入式的&#xff0c;会修改目标程序源码。直接看案例 package mainimport "fmt"func main() {test2(3)fmt.Prin…

Vue项目基于driverjs实现新用户导航

引导页就是当用户第一次或者手动进行触发的时候&#xff0c;提示给用户当前系统的模块介绍&#xff0c;比如哪里是退出&#xff0c;哪里是菜单等等相应的操作。 无论是开发 APP 还是 web 应用&#xff0c;新手引导都是一个很常见的需求&#xff0c;一般在这2个方面需要新手引导…

Java阶段二Day07

Java阶段二Day07 文章目录 Java阶段二Day07V17UserControllerDispatcherServletControllerRequestMapping V18DispatcherServletHandleMapping V19BirdBootApplication 线程池线程的执行过程线程池API 数据库数据库的基本概念数据库管理系统中常见的概念 SQL分类DDL语言-数据定…

浅析流媒体技术的发展趋势及EasyCVR视频技术的应用

随着科技的不断发展&#xff0c;流媒体已经成为人们日常生活中必不可少的一部分。为了进一步提高流媒体的质量&#xff0c;未来的技术革新方向将集中在以下几个方面&#xff1a; 1&#xff09;提高视频编解码技术的质量和效率 随着高清视频的普及&#xff0c;人们对流媒体的质…

GD32F470 移植STM32F429工程 Keil调试笔记

keil版本&#xff1a;5.25 安装 GigaDevice.GD32F4xx_DFP.3.0.4.pack Keil.STM32F4xx_DFP.2.15.0.pack 一、GD32F470 与 STM32F429 切换编译 1、原项目为STM32F429 工程&#xff0c;切换到GD32F470 只需在 Options for Target"“对话框的Device菜单中选中“GD32F470II”…

Http协议—请求的构造

目录 一、通过 form表单 构造HTTP请求 1、form 发送 Get 请求 &#xff08;1&#xff09;form 的重要参数 &#xff08;2&#xff09;input 的重要参数 2、通过 form 构造 Post 请求 二、通过 ajax 构造 HTTP 请求 1、基于 jQuery 中的 ajax 构造 &#xff08;1&#x…

动态网站开发讲课笔记07:EL和JSTL

文章目录 零、本节学习目标一、EL&#xff08;一&#xff09;EL基本语法1、EL的概念2、EL的语法3、案例演示&#xff08;1&#xff09;用EL读取保存的信息&#xff08;2&#xff09;使用Java代码与EL获取信息的对比 4、EL基本语法的特点 &#xff08;二&#xff09;EL中的标识符…

从语言模型到ChatGPT,大模型训练全攻略

文&#xff5c;python 前言 你是否想过&#xff0c;为什么ChatGPT能够如此火爆呢&#xff1f;我认为这主要是因为ChatGPT提供了好玩、有用的对话式交互功能&#xff0c;能够为用户提供帮助&#xff0c;而不仅仅是依靠“大”模型的魅力。毕竟&#xff0c;GPT-3在2020年就已经推出…

RedHat yum没有已启用源的解决方法

一般安装的红帽系统&#xff0c;自带的yum在没有付费的情况下是无使用的&#xff0c;所以我们要进行换源。 1、环境准备 先检查以下我们的linux系统环境&#xff0c;看看是不是Redhat7的版本 &#xff0c;出现如下图所示的界面 cat /etc/redhat-release 检查系统中是否安…

科技云报道:重塑增长新动能,“数智融合”捷径该如何走?

科技云报道原创。 如果说&#xff0c;过去是数字化转型的试验阶段&#xff0c;实施的是开荒动土、选种育苗&#xff0c;那么当前要进行的是精耕细作、植树造林。 数字化转型已进入了由个别行业、个别场景的“点状应用”向各行各业全流程、全环节“整体渗透”的关键期。 云计算…