【ArcGIS Pro二次开发】(11):面要素的一键拓扑

news2024/11/15 17:28:59

在工作中,经常需要对要素进行拓扑检查。

在ArcGIS Pro中正常的工作流程是在数据库中【新建要素数据集——新建拓扑——将要素加入拓扑——添加规则——验证】,工作流程不算短,操作起来比较繁琐。

 

下面以一个例子演示如何在ArcGIS Pro SDK二次开发中实现一键拓扑。


一、要实现的功能

如上图所示,在待检查的面要素上右键,单击自定义的【面要素拓扑】按钮即可,运行结果生成检查结果【TopErr_poly】。查看属性表如下:

这个工具本质上就是让拓扑的几个操作步骤在后动自动运行,所以生成的结果和拓扑结果是一样的,好处在于省时省力。

本例子只针对【单个面要素的重叠检查】,功能是少了点,后期可能会扩展一下,把拓扑功能都加进来。


二、实现流程

1、设置UI,新建自定义按钮,添加到要素图层的右键菜单里,具体可以参看我这个系列的文章。或者查看文章后面放出的工程文件,这里就不展开说了。

2、获取默认数据库、所选的要素图层,并检查是否是面要素。

            // 获取默认数据库
            var gdb = Project.Current.DefaultGeodatabasePath;
            // 获取图层
            FeatureLayer ly = MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
            // 如果选择的不是面要素或是无选择,则返回
            if (ly.ShapeType != esriGeometryType.esriGeometryPolygon || ly == null)
            {
                MessageBox.Show("请选择一个面要素,否则不能执行!");
                return;
            }

3、获取所选图层的坐标系,并通过调用Geoprocessing工具实现在默认数据库中创建要素数据集。【实际上后面的步骤都是通过调用Geoprocessing工具来实现的,真是省时省力】

            // 开启异步
            await QueuedTask.Run(async () =>
            {
                //获取图层的坐标系
                var sr = ly.GetSpatialReference();
                string db_name = "Top2Check";    // 要素数据集名
                string fc_name = "top_fc";        // 要素名
                string top_name = "Topology";       // TOP名
                string db_path = gdb + "\\" + db_name;    // 要素数据集路径
                string fc_path = db_path + "\\" + fc_name;         // 要素路径
                string top_path = db_path + "\\" + top_name;         // TOP路径
                //在数据库中创建要素数据集
                var par_CreatDatabase = Geoprocessing.MakeValueArray(gdb, db_name, sr);
                await Geoprocessing.ExecuteToolAsync("management.CreateFeatureDataset", par_CreatDatabase);
            });

4、将所选要素复制到创建的要素数据集中:

var par_CopyFeature = Geoprocessing.MakeValueArray(ly.Name, fc_path);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.CopyFeatures", par_CopyFeature));

5、新建拓扑:

var par_CreatTop = Geoprocessing.MakeValueArray(db_path, top_name);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.CreateTopology", par_CreatTop));

6、向拓扑中添加要素:

var par_AddFeatureClass = Geoprocessing.MakeValueArray(top_path, fc_path);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.AddFeatureClassToTopology", par_AddFeatureClass));

7、添加拓扑规则【重叠】:

var par_AddRule = Geoprocessing.MakeValueArray(top_path, "Must Not Overlap (Area)", fc_path, null, null, null);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.AddRuleToTopology", par_AddRule));

8、验证拓扑:

var par_Validate = Geoprocessing.MakeValueArray(top_path);
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.ValidateTopology", par_Validate));

9、输出TOP错误:

var par_ExportErrors = Geoprocessing.MakeValueArray(top_path, gdb, "TopErr");
await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.ExportTopologyErrors", par_ExportErrors));

以上就是功能实现的核心代码,整理一下,完整代码如下:

        protected override async void OnClick()
        {
            // 获取默认数据库
            var gdb = Project.Current.DefaultGeodatabasePath;
            // 获取图层
            FeatureLayer ly = MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
            // 如果选择的不是面要素或是无选择,则返回
            if (ly.ShapeType != esriGeometryType.esriGeometryPolygon || ly == null)
            {
                MessageBox.Show("请选择一个面要素,否则不能执行!");
                return;
            }
            // 开启异步
            await QueuedTask.Run(async () =>
            {
                //获取图层的坐标系
                var sr = ly.GetSpatialReference();
                string db_name = "Top2Check";    // 要素数据集名
                string fc_name = "top_fc";        // 要素名
                string top_name = "Topology";       // TOP名
                string db_path = gdb + "\\" + db_name;    // 要素数据集路径
                string fc_path = db_path + "\\" + fc_name;         // 要素路径
                string top_path = db_path + "\\" + top_name;         // TOP路径
                //在数据库中创建要素数据集
                var par_CreatDatabase = Geoprocessing.MakeValueArray(gdb, db_name, sr);
                await Geoprocessing.ExecuteToolAsync("management.CreateFeatureDataset", par_CreatDatabase);
                // 将所选要素复制到创建的要素数据集中
                var par_CopyFeature = Geoprocessing.MakeValueArray(ly.Name, fc_path);
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.CopyFeatures", par_CopyFeature));
                // 新建拓扑
                var par_CreatTop = Geoprocessing.MakeValueArray(db_path, top_name);
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.CreateTopology", par_CreatTop));
                // 向拓扑中添加要素
                var par_AddFeatureClass = Geoprocessing.MakeValueArray(top_path, fc_path);
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.AddFeatureClassToTopology", par_AddFeatureClass));
                // 添加拓扑规则【重叠】
                var par_AddRule = Geoprocessing.MakeValueArray(top_path, "Must Not Overlap (Area)", fc_path, null, null, null);
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.AddRuleToTopology", par_AddRule));
                // 验证拓扑
                var par_Validate = Geoprocessing.MakeValueArray(top_path);
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.ValidateTopology", par_Validate));
                // 输出TOP错误
                var par_ExportErrors = Geoprocessing.MakeValueArray(top_path, gdb, "TopErr");
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.ExportTopologyErrors", par_ExportErrors));
                // 删除中间要素
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.Delete", Geoprocessing.MakeValueArray(db_path)));
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.Delete", Geoprocessing.MakeValueArray(gdb + "\\TopErr_point")));
                await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.Delete", Geoprocessing.MakeValueArray(gdb + "\\TopErr_line")));
                MessageBox.Show("完成拓扑检查【面要素,不能重叠】!");
            });
        }

三、工程文件分享

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

PolygonTopology

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

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

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

相关文章

数组一次性删除多条数据

需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮&#xff0c;点击时将当前行的索引传递给方法&#xff0c;splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…

爬虫实战进阶版【1】——某眼专业版实时票房接口破解

某眼专业版-实时票房接口破解 某眼票房接口:https://piaofang.maoyan.com/dashboard-ajax 前言 当我们想根据某眼的接口获取票房信息的时候,发现它的接口处的参数是加密的,如下图: 红色框框的参数都是动态变化的,且signKey明显是加密的一个参数。对于这种加密的参数,我们需要…

第14届蓝桥杯STEMA测评真题剖析-2023年2月12日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第103讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

域权限维持之创建DSRM后门

DSRM&#xff08;目录服务还原模式&#xff09;&#xff0c;在初期安装域控的时候会让我们设置DSRM的管理员密码&#xff0c;这个密码是为了在后期域控发生问题时修复、还原或重建活动目录。DSRM账户实际上是administrator账户&#xff0c;并且该账户的密码在创建之后很少使用。…

Azure OpenAI 官方指南 01|GPT-3 的原理揭秘与微调技巧

Azure OpenAI 服务在微软全球 Azure 平台正式发布后&#xff0c;迅速成为众多用户最关心的服务之一。 Azure OpenAI 服务允许用户通过 REST API 访问 OpenAI 的强大语言模型&#xff0c;包括 GPT-3、Codex 和 Embeddings 模型系列。本期&#xff0c;我们将为您揭秘 Azure Open…

乌班图安装kvm并配置网络

乌班图22安装KVM 1.安装KVM sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinstsudo adduser id -un libvirt sudo adduser id -un kvm sudo apt install virtinst qemu-efi sudo systemctl enable --now libvirtd sudo s…

Tcl_Init error: Can‘t find a usable init.tcl in the following directories

目录 问题 解决 小结 问题 最近在研究开源波形显示软件gtkwave时,Ubuntu18.04下编译打包完成,移植到另一个电脑上运行时,出现以下错误,如图: 擦掉的部分是一些路径信息,这个错误提示意味着您的系统中缺少所需的 Tcl 初始化文件,路径下确实没有init.tcl文…

嵌入式 LVGL移植到STM32F4

目录 LVGL简介 1、特点 2、LVGL的硬件要求 3、相关网站 4、LVGL源码下载 5、LVGL移植要求 5.1 移植过程-添加源码 2、更改接口文件 3、显示实现 4、添加外部中文字体的方法 5、编译下载后有几种情况 6、调用显示 6、GUI-Guider使用 6.1 安装软件 6.2 使用…

Kakfa详解(一)

kafka使用场景 canal同步mysqlelk日志系统业务系统Topic kafka基础概念 Producer: 消息生产者&#xff0c;向kafka发送消息Consumer: 从kafka中拉取消息消费的客户端Consumer Group: 消费者组&#xff0c;消费者组是多个消费者的集合。消费者组之间互不影响&#xff0c;所有…

Wireshark+Go捕获本地TCP通信

初学计网&#xff0c;使用Wireshark观察本地端口间TCP通信过程。 目录 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤1&#xff1a; 使用go语言搭建本地客户端与服务器TCP通信&#xff0c;测试完成后在步骤2先运行服务器&#xff0c;再运行客户端。 服务器…

C语言查漏补缺(进阶)volatile、__attribute__、void*、地址对齐、$$Super$main

最近在学习RT-Thread&#xff0c;在看其源码的时候发现了许多自己不太了解的C语言知识点&#xff0c;在此查漏补缺一下。 1. 关键字 volatile volatile是C90新增关键字&#xff0c;volatile的的中文意思是adj.易变的&#xff1b;无定性的&#xff1b;无常性的&#xff1b;可…

如何使用FarsightAD在活动目录域中检测攻击者部署的持久化机制

关于FarsightAD FarsightAD是一款功能强大的PowerShell脚本&#xff0c;该工具可以帮助广大研究人员在活动目录域遭受到渗透攻击之后&#xff0c;检测到由攻击者部署的持久化机制。 该脚本能够生成并导出各种对象及其属性的CSV/JSON文件&#xff0c;并附带从元数据副本中获取…

Python|每日一练|递归|数学|数组|动态规划|树|深度优先搜索|单选记录:排列序列|三角形最小路径和|求根节点到叶节点数字之和

1、排列序列&#xff08;递归&#xff0c;数学&#xff09; 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213…

webpack基本使用和开发环境配置

目录 1 webpack 基本使用 01 webpack 简介 02 webpack 初体验 2 webpack开发环境配置 03 打包样式资源 04 打包html资源 05 打包图片资源 06 打包其他资源&#xff08;以打包icon为例&#xff09; 07 devServer 08.开发环境配置 1 webpack 基本使用 由于笔记文档没有…

批量下载Landsat遥感影像的方法

本文介绍在USGS网站批量下载Landsat系列遥感影像的方法。首先打开EarthExplorer的官网&#xff0c;首先完成注册与登录。接下来点击左侧“Search Criteria”&#xff0c;首先选择研究区域。研究区域的划定有多种方法&#xff0c;可以依据地理名称选定研究区域&#xff0c;也可以…

klipper使用webcam设置多个摄像头方式

一、前言 使用klipper设置多个摄像头&#xff0c;折腾了好些天&#xff0c;网上资料很少&#xff0c;这里写一个帖子记录一下 二、环境 参考链接&#xff1a;https://www.cnblogs.com/sjqlwy/p/klipper_webcam.html 我的klipper安装在香橙派上面&#xff0c;系统是debian&a…

这一次,彻底入门前端测试,覆盖单元测试、组件测试(2.4w 字)

前端测试一直是前端工程化中很重要的话题&#xff0c;但是很多人往往对测试产生误解&#xff0c;认为测试不仅没有什么用而且还浪费时间&#xff0c;或者测试应该让测试人员来做&#xff0c;自己应该专注于开发。所以&#xff0c;文章开头会先从"软件工程语境下的软件测试…

【运筹优化】剩余空间法求解带顺序约束的二维矩形装箱问题 + Java代码实现

文章目录一、带顺序约束的二维矩形装箱问题二、剩余空间法三、完整代码实现3.1 Instance 实例类3.2 Item 物品类3.3 PlaceItem 已放置物品类3.4 Solution 结果类3.5 RSPackingWithWeight 剩余空间算法类3.6 Run 运行类3.7 测试案例3.8 ReadDataUtil 数据读取类3.9 运行结果展示…

Spring boot + mybatis-plus 遇到 数据库字段 创建不规范 大驼峰 下划线 导致前端传参数 后端收不到参数 解决方案

最近使用springboot 连接了一个 sqlserver 数据库 由于数据库年数久远 &#xff0c;建表字段不规范 大驼峰 下划线的字段名都有 但是 java 中 Spring boot mybatis-plus 又严格按照小驼峰 格式 生成实体类 如果不是小驼峰格式 Data 注解 get set 方法 在前端请求参数 使用这个…

如何评估模糊测试工具-unibench的使用

unibench是一个用来评估模糊测试工具的benchmark。这个benchmark集成了20多个常用的测试程序&#xff0c;以及许多模糊测试工具。 这篇文章&#xff08;https://zhuanlan.zhihu.com/p/421124258&#xff09;对unibench进行了简单的介绍&#xff0c;本文就不再赘诉&#xff0c;…