【ArcGIS Pro二次开发】:三调地类面积精准统计与数据清洗实战
1. 三调地类面积统计的业务痛点做国土调查数据处理的朋友都知道三调数据最让人头疼的就是地类名称不规范。我去年接手一个省级三调项目时光是清理养殖坑塘这类非标准表述就花了整整两周。不同作业单位提交的数据里光是坑塘水面就有养殖坑塘、水产养殖、1104A等七八种写法更别说还有带可调整前缀的临时地类。这种混乱直接导致两个问题一是人工核对效率低下二是面积汇总结果失真。有次我给领导报数据因为漏统计了几个变体名称导致耕地面积少算了200多公顷差点酿成重大工作失误。后来我痛定思痛决定用ArcGIS Pro二次开发彻底解决这个问题。2. 开发环境准备2.1 基础软件配置工欲善其事必先利其器建议按这个清单准备环境ArcGIS Pro 3.0必须安装.NET 6.0运行时Visual Studio 2022社区版安装时勾选.NET桌面开发Excel 2016用于最终报表输出特别提醒安装ArcGIS Pro SDK时要注意版本匹配。我有次用Pro 2.9配SDK 3.0调试时直接报程序集不兼容错误。建议通过NuGet统一管理依赖项Install-Package ArcGIS.Core -Version 3.1.0 Install-Package NPOI -Version 2.6.02.2 工程模板选择在VS中新建项目时务必选择ArcGIS Pro Module Add-in模板。这个模板会自动生成config.daml文件这是插件的入口声明文件。我见过有人误选Class Library模板结果调试时死活加载不了工具按钮。3. 核心数据处理流程3.1 地类名称标准化处理三调数据的DLMC字段就像个方言大杂烩我的处理策略是先清洗后映射。先看这段实测有效的代码// 创建地类修正字典 var correctionDict new Dictionarystring, string { {养殖坑塘, 坑塘水面}, {水产养殖, 坑塘水面}, {1104A, 坑塘水面}, // 其他常见变体... }; using (RowCursor cursor featureClass.Search()) { while (cursor.MoveNext()) { using (Row row cursor.Current) { string originName row[DLMC].ToString(); // 处理带可调整前缀的情况 if (originName.Contains(可调整)) { row[DLMC] originName.Replace(可调整, ).Trim(); row.Store(); continue; } // 字典匹配修正 if (correctionDict.TryGetValue(originName, out string standardName)) { row[DLMC] standardName; row.Store(); } } } }关键点一定要先处理可调整这类前缀再进行字典匹配。我有次把顺序搞反了结果产生了可调整坑塘水面这种四不像字段。3.2 地类编码对照表设计TDT 1055-2019规程里的地类编码是层级结构但实际数据往往只有小类编码。我的解决方案是建立三级映射表小类编码小类名称大类编码大类名称0101水田01耕地0102水浇地01耕地0201果园02园地建议用Excel维护这个对照表然后通过NPOI库动态读取using (var fs new FileStream(地类对照表.xlsx, FileMode.Open)) { var workbook new XSSFWorkbook(fs); var sheet workbook.GetSheetAt(0); for (int i 1; i sheet.LastRowNum; i) { var row sheet.GetRow(i); string code row.GetCell(0).ToString(); string name row.GetCell(1).ToString(); // 存入内存字典... } }4. 面积统计的进阶技巧4.1 多级面积汇总方案常规的面积统计太扁平化我改进的方案是同时输出三级统计结果小类统计按原始DLMC字段汇总大类统计按映射后的大类编码汇总权属统计叠加行政区划字段对应的ArcPy调用方式# 小类统计 arcpy.Statistics_analysis(input_features, class_stats, Shape_Area SUM, DLMC) # 大类统计 arcpy.Statistics_analysis(input_features, type_stats, Shape_Area SUM, 大类编码) # 合并结果 arcpy.Merge_management([class_stats, type_stats], final_stats)4.2 零值处理的三种策略报表中的零值既占篇幅又影响阅读我总结出这些处理方案物理删除直接过滤SUM_Shape_Area0的记录逻辑隐藏在Excel中设置条件格式透明化显示占位提示用0.01公顷替代零值推荐使用NPOI实现方案3ICellStyle style workbook.CreateCellStyle(); style.DataFormat workbook.CreateDataFormat().GetFormat(#,##0.00_);[红色](#,##0.00)); foreach (IRow row in sheet) { if (row.GetCell(5).NumericCellValue 0.01) { row.GetCell(5).SetCellValue(0.01); } }5. 成果输出与可视化5.1 自动化报表生成用EPPlus库生成带格式的Excel报表using (ExcelPackage pkg new ExcelPackage()) { var ws pkg.Workbook.Worksheets.Add(地类统计); // 设置表头样式 ws.Cells[A1:E1].Style.Font.Bold true; ws.Cells[A1:E1].Style.Fill.PatternType ExcelFillStyle.Solid; ws.Cells[A1:E1].Style.Fill.BackgroundColor.SetColor(Color.LightGray); // 写入数据 ws.Cells[A2].LoadFromDataTable(dataTable, false); // 添加合计行 ws.Cells[$A{rowCount2}].Value 合计; ws.Cells[$E{rowCount2}].Formula $SUM(E2:E{rowCount1}); }5.2 专题图自动生成技巧统计结果最好配合专题图使用这段代码可以批量生成分级设色图# 创建图例 sym arcpy.mapping.Layer(input_layer).symbology sym.renderer GraduatedColorsRenderer sym.classificationField SUM_Shape_Area sym.breakCount 5 sym.colorRamp arcpy.mapping.ListColorRamps(Yellow to Red)[0] arcpy.mapping.UpdateLayer(df, layer, sym)6. 避坑指南坐标系陷阱遇到过用地理坐标系计算面积的情况结果全错。务必先检查是否使用投影坐标系推荐CGCS2000_3_Degree_GK_Zone_39等三度带投影。拓扑错误影响图斑重叠会导致面积重复计算。建议先执行arcpy.CheckGeometry_management(in_features, geometry_errors) arcpy.RepairGeometry_management(in_features)字段类型问题汇总时若遇到字段截断可能是字符串长度不足。创建字段时建议// 创建足够长的文本字段 var fields new ListFieldDescription() { new FieldDescription(DLMC, FieldType.String) { Length 50 } }; featureClass.CreateFields(fields);这套方案在多个省级三调项目中验证过最快能在15分钟内完成全省数据统计。有次应急汇报从拿到数据到生成领导需要的PPT图表全程只用了23分钟比传统人工操作快了近百倍。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2539849.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!