ArcGIS Pro二次开发实战:手把手教你写一个勘测定界TXT解析工具(C#/.NET 6)
ArcGIS Pro二次开发实战勘测定界TXT解析工具全流程解析在GIS开发领域勘测定界数据的处理一直是土地管理、城乡规划等业务中的高频需求。传统的勘测定界数据常以特定格式的TXT文件交付包含地块坐标、属性等关键信息。本文将手把手带你开发一个内嵌于ArcGIS Pro的批量解析工具实现从TXT到空间数据库的自动化转换。1. 开发环境准备与项目初始化1.1 开发环境配置开发勘测定界解析工具需要以下基础环境ArcGIS Pro 3.0确保安装时勾选SDK组件Visual Studio 2022社区版即可需安装.NET 6工作负载ArcGIS Pro SDK for .NET通过NuGet包管理器安装最新版本# 通过NuGet安装必要包 Install-Package ArcGIS.Desktop.Framework -Version 200.0.0 Install-Package ArcGIS.Core -Version 200.0.01.2 创建Add-in项目在Visual Studio中新建项目时选择ArcGIS Pro Module Add-in模板项目结构关键部分说明TxtParserAddin/ ├── Config.daml # 界面元素定义文件 ├── TxtParserButton.cs # 按钮交互逻辑 ├── ParserTool.cs # 核心解析逻辑 └── EncodingHelper.cs # 编码处理工具类提示创建项目后需在Config.daml中注册自定义工具确保其出现在ArcGIS Pro的Ribbon界面指定位置。2. 用户界面设计与参数配置2.1 DAML界面定义在Config.daml中定义工具按钮和参数输入面板button idTxtParserAddin_ParserButton caption勘测定界解析 classNameParserButton loadOnClicktrue tooltip heading工具说明将勘测定界TXT批量转换为要素类/tooltip /button2.2 参数输入面板实现创建WPF用户控件用于接收以下参数输入文件夹通过FolderBrowserDialog选择包含TXT的目录输出GDB路径使用SaveFileDialog指定地理数据库位置要素类名称文本框验证输入合法性禁止特殊字符坐标系选择预置常用坐标系下拉框支持WKID直接输入// 坐标系选择器示例代码 private void SetupSpatialReferenceCombo() { cboSpatialRef.Items.Add(new SRItem(CGCS2000, 4490)); cboSpatialRef.Items.Add(new SRItem(WGS84, 4326)); cboSpatialRef.SelectedIndex 0; } class SRItem { public string Name { get; set; } public int WKID { get; set; } // 其他构造函数和ToString重写... }3. 核心解析逻辑实现3.1 文件遍历与编码检测实现递归遍历文件夹获取所有TXT文件public static IEnumerablestring FindTxtFiles(string rootPath) { var options new EnumerationOptions { RecurseSubdirectories true, MatchCasing MatchCasing.CaseInsensitive }; return Directory.EnumerateFiles(rootPath, *.txt, options); }处理混合编码文件GBK/UTF-8的智能检测public static Encoding DetectEncoding(string filePath) { using var stream new FileStream(filePath, FileMode.Open); var detector new Ude.CharsetDetector(); detector.Feed(stream); detector.DataEnd(); return detector.Charset switch { GB18030 Encoding.GetEncoding(GB18030), UTF-8 Encoding.UTF8, _ Encoding.Default }; }3.2 坐标解析与构面算法解析勘测定界特有的坐标格式如J121.123456,N31.123456private ListCoordinate2D ParseCoordinates(string content) { var points new ListCoordinate2D(); var lines content.Split(\n); foreach (var line in lines.Where(l l.Contains(,))) { var parts line.Split(,); if (parts.Length 4) continue; try { var lon double.Parse(parts[2].TrimStart(J)); var lat double.Parse(parts[3].TrimStart(N)); points.Add(new Coordinate2D(lon, lat)); } catch { // 记录解析错误日志 } } return points; }使用PolygonBuilderEx构建多边形要素var polygon new PolygonBuilderEx(points); if (!polygon.IsSimple) { polygon.Simplify(GeometrySimplifyOptions.ForceSimplify); } return polygon.ToGeometry();3.3 属性字段提取与写入从TXT中提取标准字段的优化方案字段名提取位置处理规则地块编号第二行第三列去除前后空格地块名称第二行第四列GBK编码转换功能分类第二行第七列标准化分类代码转换// 属性提取示例 var metaLine content.Split(\n)[1]; var fields metaLine.Split(,) .Select(f f.Trim().Trim()) .ToArray(); rowBuffer[地块编号] fields.Length 2 ? fields[2] : null; rowBuffer[地块名称] fields.Length 3 ? fields[3] : 未命名地块;4. 编辑操作与事务管理4.1 编辑操作最佳实践使用EditOperation确保数据完整性var editOp new EditOperation(); editOp.Name 添加勘测定界地块; editOp.Callback(context { using var rowBuffer featureClass.CreateRowBuffer(); // ...字段赋值和几何构造 using var feature featureClass.CreateRow(rowBuffer); context.Invalidate(feature); }, featureClass); if (!editOp.Execute()) { throw new Exception(编辑操作执行失败); }4.2 事务处理与异常恢复实现带重试机制的事务提交public static async Task SaveWithRetry(Geodatabase gdb, int maxRetries 3) { for (int i 0; i maxRetries; i) { try { await gdb.ApplyEditsAsync(); return; } catch (GeodatabaseException ex) when (i maxRetries - 1) { await Task.Delay(1000 * (i 1)); } } throw new Exception($无法在{maxRetries}次尝试后保存编辑); }5. 调试与部署实战5.1 常见问题排查指南开发过程中可能遇到的典型问题及解决方案编码识别错误现象中文显示为乱码解决使用Encoding.Provider注册扩展编码支持Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);坐标顺序颠倒现象生成的面要素位置错误解决检查Coordinate2D参数顺序经度,纬度事务未提交现象要素类中看不到新增数据解决显式调用Project.Current.SaveEditsAsync()5.2 打包与分发生成.esriAddinX安装包的注意事项在VS中右键项目选择发布配置发布选项为Release|Any CPU检查生成的addinx文件是否包含所有依赖项创建安装说明文档包含最低系统要求对于企业级部署建议将addinx文件放入网络共享目录通过组策略统一分发。实际项目中我们发现在Windows 11系统上安装时可能需要以管理员身份运行ArcGIS Pro才能成功注册插件。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2576206.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!