当前位置: 首页 > article >正文

保姆级教程:在ArcGIS Pro插件中集成你的自定义工具箱(以‘消除重复要素’为例)

从脚本到按钮ArcGIS Pro插件开发实战指南在GIS日常工作中我们常常会遇到一些重复性的数据处理任务。比如数据质检环节的消除重复要素操作虽然可以通过Python脚本实现但每次都需要打开IDE或Python窗口执行代码对于非技术人员更是难以操作。本文将带你完整实现从独立Python脚本到ArcGIS Pro Ribbon界面一键式工具的蜕变过程。1. 开发环境与基础准备1.1 必要软件与SDK安装开始插件开发前请确保已准备好以下环境ArcGIS Pro 3.0建议最新版本Visual Studio 2022社区版即可ArcGIS Pro SDK for .NET与Pro版本严格对应安装SDK时常见问题排查# 验证SDK安装是否成功 Get-ItemProperty HKLM:\SOFTWARE\ESRI\ArcGISPro\SDK | Select-Object Version提示如果遇到SDK与Pro版本不匹配的情况需要完全卸载后重新安装对应版本。1.2 项目初始化步骤打开Visual Studio选择新建项目在模板中选择ArcGIS Pro Module Add-in填写项目基本信息Name: RemoveDuplicateFeaturesAddinLocation: 建议使用简短路径避免后续工具路径过长在配置向导中选择Add-in type:ArcGIS Pro ModuleFramework:.NET 6.0初始化后的项目结构应包含/RemoveDuplicateFeaturesAddin │── Config.daml │── RemoveDuplicateFeaturesAddin.csproj └── /cs └── RemoveDuplicateBtn.cs2. 核心功能封装与调试2.1 Python脚本工具箱化假设原始Python脚本如下# remove_duplicates.py import arcpy def remove_duplicates(input_fc, output_fc): 删除重复要素的核心逻辑 # 创建临时副本 temp_fc in_memory/temp arcpy.CopyFeatures_management(input_fc, temp_fc) # 使用DeleteIdentical工具 arcpy.DeleteIdentical_management( temp_fc, [Shape], 10 Centimeters ) # 保存结果 arcpy.CopyFeatures_management(temp_fc, output_fc) arcpy.Delete_management(temp_fc)将其转换为工具箱的步骤在ArcGIS Pro中右键点击工具箱文件夹选择新建 工具箱命名为RemoveDuplicates.tbx右键工具箱选择添加 脚本在向导中配置名称RemoveDuplicates标签消除重复要素描述基于几何位置删除重复的空间要素关联Python脚本文件设置参数参数1输入要素类数据类型要素图层参数2输出要素类数据类型要素类2.2 插件按钮功能实现在Visual Studio中打开自动生成的按钮类文件如RemoveDuplicateBtn.cs修改核心逻辑protected override async void OnClick() { try { // 获取当前活动地图 var map MapView.Active.Map; // 获取用户选择的图层 var selectedLayer map.GetLayersAsFlattenedList() .FirstOrDefault(l l.IsSelected); if (selectedLayer null) { MessageBox.Show(请先在地图中选择一个要素图层); return; } // 设置输出路径使用临时地理数据库 string outputPath C:\Temp\Output.gdb\Cleaned_ selectedLayer.Name; // 构建参数数组 var parameters Geoprocessing.MakeValueArray( selectedLayer, // 输入要素 outputPath // 输出位置 ); // 异步执行工具 await QueuedTask.Run(() { string toolPath RemoveDuplicates.tbx\RemoveDuplicates; var result Geoprocessing.ExecuteToolAsync(toolPath, parameters); // 检查执行结果 if (!result.IsCompletedSuccessfully) { throw new Exception(工具执行失败: result.ErrorMessages); } }); // 自动添加结果到地图 await Project.Current.AddItemAsync(new FileGeodatabaseItem( new Uri(Path.GetDirectoryName(outputPath)) )); } catch (Exception ex) { MessageBox.Show($处理出错: {ex.Message}); } }3. 用户界面优化设计3.1 DAML界面配置修改Config.daml文件添加按钮定义button idRemoveDuplicateBtn caption消除重复要素 classNameRemoveDuplicateBtn loadOnClicktrue smallImageImages/RemoveDuplicates16.png largeImageImages/RemoveDuplicates32.png tooltip heading工具提示 一键删除选定图层中的重复空间要素disabledText / /tooltip /button3.2 多语言支持方案为满足国际化需求可以添加资源文件创建Resources.resx文件添加键值对RemoveDuplicateBtn_Caption: 消除重复要素RemoveDuplicateBtn_Tooltip: 一键删除选定图层中的重复空间要素修改DAML引用方式button ... caption{res:RemoveDuplicateBtn_Caption} tooltip heading{res:Tooltip_Heading} {res:RemoveDuplicateBtn_Tooltip} /tooltip /button4. 部署与团队协作方案4.1 插件打包与签名使用VS的发布功能生成.esriAddinX文件右键项目选择发布配置发布位置添加数字签名需提前获取代码签名证书# 使用PowerShell签名示例 $cert Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert Set-AuthenticodeSignature -FilePath .\RemoveDuplicateFeaturesAddin.esriAddinX -Certificate $cert4.2 企业级部署策略对于团队环境推荐采用以下部署流程部署方式适用场景操作步骤共享目录小型团队将.esriAddinX文件放在网络共享位置用户双击安装组策略大型机构通过AD组策略推送注册表设置和插件文件Pro配置云环境打包到Pro工程模板中自动加载4.3 版本控制最佳实践建议的版本管理方案使用Git进行源代码管理遵循语义化版本控制主版本号重大架构变更次版本号新增功能修订号Bug修复在AssemblyInfo.cs中维护版本信息[assembly: AssemblyVersion(1.0.1)] [assembly: AssemblyFileVersion(1.0.1)]5. 高级功能扩展5.1 参数动态校验增强按钮的交互性添加参数验证逻辑protected override void OnUpdate() { // 仅当有要素图层被选中时按钮才可用 Enabled MapView.Active?.Map?.GetLayersAsFlattenedList() ?.Any(l l is FeatureLayer l.IsSelected) ?? false; }5.2 进度反馈与取消支持改进用户体验添加进度条和取消操作var progressor new Progressor(正在消除重复要素...); var cancelSource new CancellationTokenSource(); await QueuedTask.Run(() { using (var progress new ProgressorStep(progressor, 3)) { progress.Advance(准备数据...); // 第一步操作 progress.Advance(处理中...); // 核心处理逻辑 progress.Advance(保存结果...); // 输出处理 } }, cancelSource.Token);5.3 日志记录与分析添加企业级日志功能private static readonly ILog _logger LogManager.GetLogger(typeof(RemoveDuplicateBtn)); protected override async void OnClick() { _logger.Info(开始执行消除重复要素操作); try { // ...原有逻辑... _logger.Info($成功处理图层: {selectedLayer.Name}); } catch (Exception ex) { _logger.Error(处理失败, ex); throw; } }配置NLog.config文件targets target namefile xsi:typeFile fileName${basedir}/logs/${shortdate}.log layout${longdate}|${level}|${message} / /targets rules logger name* minlevelInfo writeTofile / /rules

相关文章:

保姆级教程:在ArcGIS Pro插件中集成你的自定义工具箱(以‘消除重复要素’为例)

从脚本到按钮:ArcGIS Pro插件开发实战指南 在GIS日常工作中,我们常常会遇到一些重复性的数据处理任务。比如数据质检环节的"消除重复要素"操作,虽然可以通过Python脚本实现,但每次都需要打开IDE或Python窗口执行代码&am…...

Visual Studio 项目属性页开发完全教程:从基础到高级

Visual Studio 项目属性页开发完全教程:从基础到高级 【免费下载链接】project-system The .NET Project System for Visual Studio 项目地址: https://gitcode.com/gh_mirrors/pr/project-system Visual Studio 项目属性页是开发者管理项目配置的核心界面&a…...

小说下载器终极指南:一站式解决100+网站小说保存难题

小说下载器终极指南:一站式解决100网站小说保存难题 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,你是否曾因小说突然下架、网站404或网络中…...

Qwen3-Coder-30B-A3B-Instruct-FP8:终极代码模型对比分析指南

Qwen3-Coder-30B-A3B-Instruct-FP8:终极代码模型对比分析指南 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8 在当今AI代码生成领域,Qwen3-Coder-30B-…...

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用?完整教程来了

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用?完整教程来了 【免费下载链接】deberta-v3-base-zeroshot-v2.0 项目地址: https://ai.gitcode.com/hf_mirrors/NingBo_Ascend/deberta-v3-base-zeroshot-v2.0 deberta-v3-base-zeroshot-v2.0是一款基…...

3个关键功能解析:USBToolBox如何简化macOS与Windows的USB端口映射难题

3个关键功能解析:USBToolBox如何简化macOS与Windows的USB端口映射难题 【免费下载链接】tool the USBToolBox tool 项目地址: https://gitcode.com/gh_mirrors/too/tool 在Hackintosh和跨平台开发领域,USB端口映射一直是个令人头疼的技术难题。US…...

tools.simonwillison.net图像处理工具集:从裁剪到优化的完整指南

tools.simonwillison.net图像处理工具集:从裁剪到优化的完整指南 【免费下载链接】tools Assorted useful tools, almost entirely generated using LLMs 项目地址: https://gitcode.com/gh_mirrors/tools23/tools tools.simonwillison.net图像处理工具集是一…...

多自由度冗余空间机械臂位姿一体化规划与控制【附代码】

✨ 长期致力于空间机械臂、对偶四元数、位姿一体化、路径规划、跟踪控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于对偶四元数的冗余机械臂运…...

Spring Cloud AWS 实战教程:构建高可用 SQS 消息队列应用 [特殊字符]

Spring Cloud AWS 实战教程:构建高可用 SQS 消息队列应用 🚀 【免费下载链接】spring-cloud-aws The New Home for Spring Cloud AWS 项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-aws Spring Cloud AWS 是一个强大的开源框架&…...

T型翼/尾板导向的穿浪双体船姿态控制【附代码】

✨ 长期致力于穿浪双体船、T型翼、尾板、多自由度姿态控制、舒适性评估研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)动态水翼升力模型与耦合运动方…...

身份证OCR识别接口接入实战:Python/Java/PHP/C#四语言代码示例与踩坑指南

#身份证OCR, #OCR接口, #API接入, #Python示例, #Java示例, #PHP示例, #踩坑指南, #石榴智能, #实名认证, #图片识别 身份证OCR识别接口接入实战:Python/Java/PHP/C#四语言代码示例与踩坑指南 作者:石榴智能技术团队 一、前言 身份证OCR识别已经不是什…...

FCEUX终极指南:从怀旧游戏到专业调试的完整NES模拟器教程

FCEUX终极指南:从怀旧游戏到专业调试的完整NES模拟器教程 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux FCEUX是一款功能强大的开源NES模拟器,让你在现代电脑上完美重温经典红白机游戏。无论…...

Python基础语法:访问器@property和修改器@xxx.setter

一、简介 访问器和修改器也是装饰器的一种。 property: 访问器,getter xxx.setter: 修改器,setter 访问器和修改器的根本目的是想将属性私有化,提供getter&setter去访问。 访问器和修改器能够做到访问属性其实在调用getter方法&#xff0…...

AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度

AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度 【免费下载链接】alphafold3 AlphaFold 3 inference pipeline. 项目地址: https://gitcode.com/gh_mirrors/alp/alphafold3 你是否在蛋白质结构预测项目中遇到MSA生成效率低下的瓶颈&#x…...

Buzz音频转录完全指南:3大核心功能+5个实战场景,快速掌握本地语音转文字技术

Buzz音频转录完全指南:3大核心功能5个实战场景,快速掌握本地语音转文字技术 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Tr…...

别再乱用分支了!Flowable四种网关(排他/并行/包容/事件)实战选型指南

Flowable四大网关实战选型:从混乱到精准的决策艺术当你在设计一个请假审批流程时,是否遇到过这样的困惑:部门经理审批后需要同时通知HR和财务,但某些特殊情况下又需要跳过财务直接归档?这种看似简单的业务需求&#xf…...

DISMTools企业部署:在组织中大规模应用的最佳实践

DISMTools企业部署:在组织中大规模应用的最佳实践 【免费下载链接】DISMTools The connected place for Windows system administration 项目地址: https://gitcode.com/GitHub_Trending/di/DISMTools DISMTools是一款专为Windows系统管理设计的连接平台&…...

除了ulimit -c unlimited:深入理解Linux core dump机制与高级配置指南

深入Linux核心转储:从基础配置到生产环境实战指南当服务器上的关键应用突然崩溃时,系统管理员最需要的就是一份完整的"事故现场记录"。Linux的core dump机制正是为此而生,它能保存程序崩溃时的内存状态、寄存器值和调用堆栈&#x…...

Stitches API完全指南:从基础配置到自定义扩展

Stitches API完全指南:从基础配置到自定义扩展 【免费下载链接】stitches HTML5 Sprite Sheet Generator 项目地址: https://gitcode.com/gh_mirrors/sti/stitches Stitches是一款强大的HTML5 Sprite Sheet Generator,它提供了直观的API接口&…...

Unity UGUI轻量UI框架:200行代码实现零GC界面管理

1. 为什么还要自己手写UI框架?——当UGUI原生方案开始“卡脖子”很多人看到这个标题第一反应是:“都2024年了,还手写UI框架?Asset Store里几十个成熟方案,NGUI、FairyGUI、TextMeshPro配套的UI系统一抓一大把&#xff…...

隧道裂缝剥落病害AI识别系统

我国现有公路隧道超2.5万座,总里程超2.8万公里,其中运营超过15年的老旧隧道占比达35%。据交通运输部2025年统计,年均因隧道结构病害导致的交通中断超1200次,直接经济损失超45亿元。传统检测模式暴露四大核心痛点:检测周…...

Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)

更多请点击: https://codechina.net 第一章:Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型,其提示词(prompt)工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...

STM32单片机学习(28) —— STM32的SPI外设

文章目录概述SPI通信的移位机制(以bit为单位)SPI外设框图第一部分:数据通路SPI通信的数据帧格式SPI外设移位机制(以字节为单位)第二部分:主机时钟生成器SPI通信时钟频率与传输速率第三部分:主从…...

DeepSeek代码质量评估实战手册:7步完成从混沌到可度量的质变跃迁

更多请点击: https://kaifayun.com 第一章:DeepSeek代码质量评估的底层逻辑与核心价值 DeepSeek代码质量评估并非简单地统计行数或检测语法错误,而是基于多维语义理解构建的推理系统。其底层逻辑融合了静态分析、符号执行与大语言模型生成式…...

STM32单片机学习(27) —— SPI相关概念

文章目录概述SPI通信的核心特性I2C和SPI的简单对比SPI学习的补充说明SPI硬件电路设计SPI的四条通信线SPI通信的片选线低电平选中不支持广播通信SPI通信的时序结构(重点)SPI通信的比特序通信空闲状态,SPI时钟极性采样时机,SPI时钟相…...

保姆级教程:在CentOS 7上用达梦8搭建DCA练习环境(附ulimit、VNC、ODBC全配置)

达梦8 DCA认证实战:CentOS 7环境搭建与调优全指南 在国产数据库技术快速发展的今天,达梦数据库作为核心产品之一,其DCA认证已成为众多从业者提升竞争力的重要选择。与理论为主的认证不同,DCA更注重实际操作能力,而一个…...

CentOS 7下‘Development Tools’和‘开发工具’组有区别吗?实测告诉你答案

CentOS 7下‘Development Tools’与‘开发工具’的隐藏关联:技术细节全解析在Linux系统管理中,yum的软件包组功能一直是个既实用又充满谜团的领域。特别是当系统语言环境与软件包元数据语言不一致时,开发者们常常会遇到一个有趣的现象&#x…...

DeepSeek RAG系统渗透测试全链路复现(含PoC代码与防御加固清单)

更多请点击: https://kaifayun.com 第一章:DeepSeek RAG系统渗透测试全链路复现概览 DeepSeek RAG系统作为面向企业级知识检索增强生成的典型架构,其安全边界不仅涵盖LLM服务层,更延伸至向量数据库、检索代理、提示工程网关及外部…...

CVPR 2023反无人机数据集实战:用ModelScope上的开源模型快速上手目标检测

CVPR 2023反无人机数据集实战:用ModelScope上的开源模型快速上手目标检测无人机技术的普及带来了新的安全挑战,从隐私侵犯到关键设施威胁,反无人机技术正成为计算机视觉领域的热点。CVPR 2023反无人机竞赛提供的开源数据集和基线模型&#xf…...

艾尔登法环帧率解锁终极指南:告别卡顿,畅享丝滑游戏体验

艾尔登法环帧率解锁终极指南:告别卡顿,畅享丝滑游戏体验 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_m…...