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

news/2024/11/21 1:40:08/

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

在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("完成拓扑检查【面要素,不能重叠】!");});}

三、工程文件分享

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

PolygonTopologyhttps://pan.baidu.com/s/1Djt-duOUc2MxsHfUPdhBHA?pwd=1q02

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


http://www.ppmy.cn/news/29428.html

相关文章

Spark开发实战-主播打赏排行榜统计

(一)需求分析 计算每个大区当天金币收入排名前N的主播 背景: 我们有一款直播APP,已经在很多国家上线并运营了一段时间,产品经理希望开发一个功能,计算前N主播排行榜,按天更新排名信息&#xf…

Nodejs模块化

1.模块化 1.1.模块化的基本概念 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程。对于整个系统而言,模块是可组合、分解和更换的单元。 1.2 编程中的模块化 编程领域的模块化就是把一个大文件拆成独立并相互依赖的多个小模块…

【2023】某python语言程序设计跟学第二周内容

本文说明: 案例内容为北理工python语言程序设计课程,如有不妥请联系! 目录蟒蛇绘制案例:执行结果:代码分析:举一反三:绘制一个五角星图案执行结果:turtle库根据案例简单说明&#xf…

大话数据结构-普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal)

5 最小生成树 构造连通网的最小代价生成树称为最小生成树,即Minimum Cost Spanning Tree,最小生成树通常是基于无向网/有向网构造的。 找连通网的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法。 5.1 普里姆&#xff…

计算机网络安全基础知识2:http超文本传输协议,请求request消息的get和post,响应response消息的格式,响应状态码

计算机网络安全基础知识: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤…

vue2 @hook 的解析与妙用

目录前言几种用法用法一 将放在多个生命周期的逻辑,统一到一个生命周期中用法二 监听子组件生命周期运行的情况运用场景场景一 许多时候,我们不得不在不同的生命周期中执行某些逻辑,并且这些逻辑会用到一些通用的变量,这些通用变量…

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…

【Hello Linux】程序地址空间

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍下进程地址空间 程序地址空间程序地址空间语言中的程序地址空间矛盾系统中的程序地址空间为什么要有进程地址空间思维导图总结…