【ArcGIS Pro二次开发】(11):面要素的一键拓扑
在工作中,经常需要对要素进行拓扑检查。
在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文件直接安装。
相关文章:
【ArcGIS Pro二次开发】(11):面要素的一键拓扑
在工作中,经常需要对要素进行拓扑检查。 在ArcGIS Pro中正常的工作流程是在数据库中【新建要素数据集——新建拓扑——将要素加入拓扑——添加规则——验证】,工作流程不算短,操作起来比较繁琐。 下面以一个例子演示如何在ArcGIS Pro SDK二次…...
【实现点击下载按钮功能 Objective-C语言】
一、实现点击下载按钮功能, 1.接下来,我们再实现另外一个功能,是什么,点击下载按钮吧: 点击下载按钮,是不是要有效果啊, 就是给大家实现这个功能, 首先,我们要实现单击这个效果,是不是要给按钮注册单击事件吧, 请问,这个按钮在哪里啊,是在控制器里面吗,不是,…...
界面控件DevExpress WinForm——轻松构建类Visual Studio UI(三)
DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…...
项目实战-瑞吉外卖day01(B站)
瑞吉外卖-Day01课程内容软件开发整体介绍瑞吉外卖项目介绍开发环境搭建后台登录功能开发后台退出功能开发1. 软件开发整体介绍作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责&am…...
Linux 学习整理(使用 iftop 查看网络带宽使用情况 《端口显示》)
一、命令简介 iftop 是实时流量监控工具,可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等。 二、命令安装 yum install -y iftop 三、命令相关参数及说明 3.1、相关参数说明 -i:设定监测的网卡&#…...
Vue3创建项目(四)axios封装及接口配置
项目结构: 目录 🍉🍉🍉index.ts 🍉🍉🍉 api.ts 看完需要预计花费10分钟。 请求拦截器与响应拦截器 阅读下面代码需先了解以下内容: 请求拦截器: 请求拦截器的作用是在请求发送前进…...
【算法笔记】递归与回溯
递归与回溯 To Iterate is Human, to Recurse, Divine. —L. Peter Deutsch 人理解迭代,神理解递归。 —L. Peter Deutsch 1.什么是递归呢 递归形象描述: 你打开面前这扇门,看到屋里面还有一扇门。 你走过去,发现手中的钥匙还可以…...
蓝桥杯备赛——Echarts学习
文章目录前言学习 ECharts 的方法快速上手基础知识option 配置选项可选配置title 标题组件tooltip 提示框组件axisPointer 坐标轴指示器legend 图例组件toolbox 工具栏坐标轴xAxis和yAxisseries ([ ]用数组表示,数组里是一个个数据对象)饼状图散点图交互…...
动态规划--最长公共子串
最长公共子串公共子串问题费曼算法动态规划算法思路代码实现公共子串问题 在计算机科学中,最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。链接: 百度百科 费曼算法…...
【运筹优化】剩余空间法求解带顺序约束的二维矩形装箱问题 + 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 运行结果展示…...
第四阶段15-关于权限,处理解析JWT时的异常,跨域请求,关于Spring Security的认证流程
处理解析JWT时的异常 由于解析JWT是在过滤器中执行的,而过滤器是整个服务器端中最早接收到所有请求的组件,此时,控制器等其它组件尚未运行,则不可以使用此前的“全局异常处理器”来处理解析JWT时的异常(全局异常处理器…...
毕业设计 基于51单片机的指纹红外密码电子锁
基于51单片机的指纹红外密码电子锁1、项目简介1.1 系统框架1.2 系统功能2、部分电路设计2.1 STC89C52单片机最小系统电路设计2.2 矩阵按键电路电路设计2.3 液晶显示模块电路设计3、部分代码展示3.1 LCD12864显示字符串3.2 串口初始化实物图1、项目简介 选题指导,项…...
【JavaWeb】数据链路层协议——以太网 + 应用层协议——DNS
以太网 以太网不是一个具体的网络,而是一个技术标准,主要应用于数据链路层和物理层。 以太网数据帧结构 以太网的数据帧结构由三部分构成: 帧头 载荷 帧尾 其中的MAC地址是六位,这样就比IPV4所表示的地址大很多,…...
docker 容器安装 python jre
Dockerfile FROM python:2.7.11-alpine RUN mkdir /usr/local/java WORKDIR /usr/local/java # 5.更改 Alpine 的软件源为阿里云,默认从官方源拉取比较慢 RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \ echo…...
Linux下将C++程序打包成动态库静态库方法
之前在这篇文章里介绍过动态库和静态库的理论部分,这篇文章主要介绍下实际的操作步骤: 静态链接库生成 gcc -c main.cpp -o main.o ar -rc libmain.a main.o sudo cp libmain.a /usr/local/lib 调用即可解释一下上面的命令:前两步生成了libmain.a sudo…...
Centos7 服务器基线检查处理汇总
1、服务器超时设置 问题描叙 TMOUT的值大于key2且小于等于{key2}且小于等于key2且小于等于{key1}视为合规 查看命令:export检测结果 超时时间:0处理方式 备份/etc/profile文件 cp /etc/profile /etc/profile_bak编辑profile文件 vim /etc/profile修改/新增 TMO…...
PaddleOCR遇到 lanms-neo问题处理
在window环境中安装PaddleOCR依赖是真的蛋疼,关键官方论坛里也都没有具体的解决方案。吐槽。。。吐槽。。。 我在 “windows安装lanms-neo问题处理”文章中看到lanms-neo问题全过程解决。个人觉得文档说明不是很细致,导致我按步骤执行,还是安…...
coreldraw2023安装包下载及新功能介绍
对于广告标识业来说 coreldraw这个软件,对我们来说绝对不陌生,我从2008年开始接触到广告制作,到现在已经13多年了,从一开始的coreldraw 9红色的热气球开始。就被这个强大的软件所吸引,他有强大的排榜功能已经对位图的处…...
Nginx 负载均衡服务失败场景
nginx可以配置负载均衡,我们可以通过配置实现nginx负载均衡。这里部署了两个服务producter-one和producter-one2。 upstream proxyproducter-one {server producter-one:8080 weight1;server producter-one2:8080 weight1;}# 访问其他服务server {listen 9090…...
开学季哪个电容笔好?2023口碑最好电容笔推荐
虽说苹果原装的电容笔非常好用,性能也非常不错,但由于价格昂贵,普通的学生是没办法购买的,再加上重量比较大,使用时间长了,难免会让人感觉到疲劳。如果仅仅是为了学习记笔记,那就没必要再去购买…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
