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

【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.0

2.2 工程模板选择

在VS中新建项目时,务必选择"ArcGIS Pro Module Add-in"模板。这个模板会自动生成config.daml文件,这是插件的入口声明文件。我见过有人误选Class Library模板,结果调试时死活加载不了工具按钮。

3. 核心数据处理流程

3.1 地类名称标准化处理

三调数据的DLMC字段就像个"方言大杂烩",我的处理策略是"先清洗后映射"。先看这段实测有效的代码:

// 创建地类修正字典 var correctionDict = new Dictionary<string, 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 多级面积汇总方案

常规的面积统计太扁平化,我改进的方案是同时输出三级统计结果:

  1. 小类统计:按原始DLMC字段汇总
  2. 大类统计:按映射后的大类编码汇总
  3. 权属统计:叠加行政区划字段

对应的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 零值处理的三种策略

报表中的零值既占篇幅又影响阅读,我总结出这些处理方案:

  1. 物理删除:直接过滤SUM_Shape_Area=0的记录
  2. 逻辑隐藏:在Excel中设置条件格式透明化显示
  3. 占位提示:用"<0.01公顷"替代零值

推荐使用NPOI实现方案3:

ICellStyle 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{rowCount+2}"].Value = "合计"; ws.Cells[$"E{rowCount+2}"].Formula = $"SUM(E2:E{rowCount+1})"; }

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. 避坑指南

  1. 坐标系陷阱:遇到过用地理坐标系计算面积的情况,结果全错。务必先检查是否使用投影坐标系,推荐CGCS2000_3_Degree_GK_Zone_39等三度带投影。

  2. 拓扑错误影响:图斑重叠会导致面积重复计算。建议先执行:

arcpy.CheckGeometry_management(in_features, "geometry_errors") arcpy.RepairGeometry_management(in_features)
  1. 字段类型问题:汇总时若遇到字段截断,可能是字符串长度不足。创建字段时建议:
// 创建足够长的文本字段 var fields = new List<FieldDescription>() { new FieldDescription("DLMC", FieldType.String) { Length = 50 } }; featureClass.CreateFields(fields);

这套方案在多个省级三调项目中验证过,最快能在15分钟内完成全省数据统计。有次应急汇报,从拿到数据到生成领导需要的PPT图表,全程只用了23分钟,比传统人工操作快了近百倍。

http://www.jsqmd.com/news/676597/

相关文章:

  • 5分钟搞定OFD转PDF:开源神器Ofd2Pdf终极使用指南
  • USB PD PPS便携电源设计:原理与工程实践
  • VHDL并发信号赋值与BLOCK语句实战解析
  • 齿轮箱零部件及其装配质检中的TVA技术突破(18)
  • 聊聊不错的转接线厂家,钦利发口碑如何? - 工业品网
  • MATLAB绘图避坑:箭头颜色总是不对?一文搞懂arrow3和quiver3的颜色控制机制
  • CodeForces-2168B Locate 题解
  • 别再只会用$random了!手把手教你用Verilog LFSR生成更可控的伪随机数(附完整代码)
  • 在Windows上运行iOS应用的终极方案:ipasim跨平台模拟器深度解析
  • 同态加密实战:用Go实现一个隐私保护的投票系统(附完整代码)
  • 表和约束的区别
  • 从图像到文本:对比学习Loss(InfoNCE)在CLIP和SimCSE中的实战调参指南
  • 别再死记公式了!用Python+LTspice快速验证RC/LC滤波器设计(附代码)
  • YOLOv8集成DCNv2:从原理到实战的涨点技巧
  • ComfyUI-SUPIR 终极指南:三步实现专业级图像超分辨率
  • TVA时代企业IT工程师的转型之路(一)
  • 从CPU指纹到安全防御:如何利用CPUID与LBR/BTS检测内核级Rootkit?
  • 告别libpng!用这个轻量级C库lodepng,5分钟搞定PNG图片解码(附完整代码)
  • 手把手教你用Logstash Grok插件解析华为防火墙USG6600E的Syslog日志(附完整正则)
  • 别再用@Async默认线程池了!手把手教你为不同业务定制专属的ThreadPoolTaskExecutor
  • CosyVoice语音克隆5分钟上手:3步搞定声音复制,零基础也能玩转
  • 3步掌握OpenRocket:新手也能快速上手的火箭设计仿真完整指南
  • 从网线到内存:奇偶校验、CRC、海明码在计算机硬件里的那些‘隐藏关卡’
  • 技术书籍解毒指南:90分钟吸收法
  • B站视频转换神器:3分钟实现m4s到MP4无损转换
  • RWKV-7 (1.5B World)效果展示:连续5轮跨语言对话不崩坏的真实记录
  • 为什么你需要一个窗口尺寸强制调整工具?5个真实场景揭示隐藏需求
  • OpenCore Legacy Patcher:终极指南让旧Mac焕发新生,轻松升级最新macOS
  • iscsi多路径,nginx服务
  • 告别抓瞎!用Wireshark颜色规则自定义你的专属网络诊断视图(以排查直播卡顿为例)