news 2026/4/29 11:15:36

ArcGIS Pro二次开发实战:手把手教你封装一个‘三调三大类统计’工具(附C#源码解析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArcGIS Pro二次开发实战:手把手教你封装一个‘三调三大类统计’工具(附C#源码解析)

ArcGIS Pro二次开发实战:三调三大类统计工具开发全解析

在国土调查和空间规划领域,第三次全国国土调查(简称"三调")数据的统计分析是一项基础且重要的工作。传统手动操作不仅效率低下,还容易出错。本文将带你从零开发一个ArcGIS Pro插件工具,实现三调三大类用地的自动化统计与Excel报表生成。

1. 开发环境准备与项目创建

首先确保你的开发环境满足以下要求:

  • ArcGIS Pro 3.0+(建议最新版本)
  • Visual Studio 2022(社区版即可)
  • .NET 6.0 SDK
  • ArcGIS Pro SDK for .NET

创建Add-in项目的基本步骤:

# 通过NuGet安装必要包 Install-Package ArcGIS.Desktop.Framework Install-Package ArcGIS.Desktop.Mapping

项目结构关键文件说明:

StatisticsSD/ ├── Config.daml # 插件界面定义文件 ├── StatisticsSD.csproj # 项目文件 ├── StatisticsSDButton.cs # 按钮逻辑实现 └── ExcelTemplate/ # Excel模板资源

提示:建议将Excel模板文件作为嵌入式资源添加到项目中,便于部署时自动包含。

2. 用户界面设计与参数配置

在Config.daml文件中定义工具界面:

<button id="StatisticsSD_Button" caption="三调三大类统计" className="StatisticsSDButton" loadOnClick="true"> <tooltip heading="工具说明">自动统计三调数据中的农用地、建设用地和未利用地面积</tooltip> </button>

核心参数输入对话框实现:

public class StatisticsSDButton : Button { protected override async void OnClick() { // 创建参数输入对话框 var dialog = new OpenItemDialog { Title = "三调三大类统计", MultiSelect = false }; // 添加输入控件 dialog.AddControl(new FeatureLayerControl("三调图层")); dialog.AddControl(new FieldControl("面积字段", "shape_area")); dialog.AddControl(new SaveFileControl("输出Excel路径", "*.xlsx")); if (dialog.ShowDialog() == true) { await ExecuteStatistics(dialog.Values); } } }

3. 核心统计逻辑实现

3.1 地类分类与SQL筛选

根据《第三次全国国土调查技术规程》,三大类用地的地类编码如下:

大类包含地类编码
农用地'0303','0304','0306','0402','0101','0102','0103','0201','0201K'...
建设用地'0603','05H1','0508','0601','0602','0701','0702','08H1','08H2','0809'...
未利用地'1105','1106','1108','0404','1101','1102','1110','1204','1205','1206','1207'

对应的SQL筛选语句构建:

string sql_nyd = "DLBM IN ('0303','0304','0306','0402','0101','0102','0103','0201','0201K','0202','0202K','0204','0301', '0301K', '0302', '0302K' ,'0305','0307','0401' ,'0402' ,'0403' ,'1006','1103','1104','1104A', '1104K' ,'1107', '1107A', '1202' ,'1203')"; string sql_jsyd = "DLBM IN ('0603','05H1','0508','0601','0602','0701','0702','08H1','08H2','0809','0810','0810A','09','1001', '1002','1003','1004','1005','1007','1008','1009', '1109', '1201')"; string sql_wlyd = "DLBM IN ( '1105','1106' ,'1108' ,'0404' ,'1101' ,'1102','1110','1204' ,'1205' ,'1206' ,'1207' )";

3.2 面积统计与数据处理流程

完整的统计工作流可分为以下步骤:

  1. 初始面积汇总

    Arcpy.Statistics(fc_path, gdb + @"\statistisc_all", bm_field + @" SUM", "DLBM");
  2. 分类筛选

    Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_nyd", sql_nyd); Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_jsyd", sql_jsyd); Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_wlyd", sql_wlyd);
  3. 分类汇总

    Arcpy.Statistics(gdb + @"\statistisc_nyd", gdb + @"\all_nyd", "SUM_" + bm_field + @" SUM", ""); Arcpy.Statistics(gdb + @"\statistisc_jsyd", gdb + @"\all_jsyd", "SUM_" + bm_field + @" SUM", ""); Arcpy.Statistics(gdb + @"\statistisc_wlyd", gdb + @"\all_wlyd", "SUM_" + bm_field + @" SUM", "");
  4. 数据合并与单位转换

    // 添加分类字段 Arcpy.AddField(gdb + @"\all_nyd", "地类名称", "TEXT"); Arcpy.CalculateField(gdb + @"\all_nyd", "地类名称", "'农用地'"); // 合并表格 List<string> files = new List<string>() { gdb + @"\all_nyd", gdb + @"\all_jsyd", gdb + @"\all_wlyd"}; Arcpy.Merge(files, gdb + @"\all_merge", true); // 转换为公顷 Arcpy.CalculateField(gdb + @"\all_merge", "SUM_SUM_" + bm_field, "!SUM_SUM_" + bm_field + "!/10000");

4. Excel报表生成与高级功能

4.1 Excel模板设计技巧

一个专业的统计报表模板应包含:

  • 封面页:项目名称、制表单位、日期等
  • 数据页:三大类面积统计表
  • 图表页:面积占比饼图或柱状图
  • 公式计算:自动计算各类占比和汇总

模板关键单元格公式示例:

B4单元格:=SUM(C6:C8) # 总面积 C6单元格:=VLOOKUP("农用地",数据源!A:B,2,FALSE) # 农用地面积 D6单元格:=C6/$B$4 # 农用地占比

4.2 数据映射与Excel操作

将统计结果写入Excel的核心代码:

// 复制模板文件 ToolManager.CopyResourceFile(@"CCTool.Data.Excel.三调三大地类统计表.xlsx", table_path); // 获取统计结果字典 Dictionary<string, string> dict = ToolManager.GetDictFromTable("all_merge", "地类名称", "SUM_SUM_" + bm_field); // 映射到Excel ToolManager.ExcelAttributeMapper(table_path + @"\Sheet1$", 2, 3, dict, 3);

4.3 错误处理与日志记录

健壮的工具应包含完善的错误处理:

try { // 执行统计操作 } catch (ArcGIS.Core.CalledFailException ex) { MessageBox.Show($"GP工具执行失败:{ex.Message}"); Logger.Error(ex, "GP工具错误"); } catch (IOException ex) { MessageBox.Show($"文件操作错误:{ex.Message}"); Logger.Error(ex, "IO异常"); } finally { // 清理临时数据 CleanTempData(gdb); }

5. 项目调试与部署技巧

5.1 调试配置要点

在Visual Studio中配置调试环境:

  1. 项目属性 → 调试 → 启动外部程序:设置为ArcGIS Pro的exe路径
  2. 添加环境变量:ESRI_ADDIN_PATH指向你的Add-in输出目录
  3. 启用混合模式调试:便于同时调试托管代码和ArcGIS Pro原生代码

5.2 性能优化建议

处理大型三调数据集时,可采用以下优化策略:

  • 分块处理:对于超大数据集,按行政区划分块处理
  • 内存优化:及时释放中间表,避免内存泄漏
  • 并行处理:对三大类统计可并行执行
// 并行处理示例 Parallel.Invoke( () => ProcessLandType(sql_nyd, "农用地"), () => ProcessLandType(sql_jsyd, "建设用地"), () => ProcessLandType(sql_wlyd, "未利用地") );

5.3 插件部署与更新

部署时的注意事项:

  • .esriAddinX文件分发给用户直接安装
  • 通过Add-in Manager管理插件版本
  • 考虑添加自动更新功能:
// 检查更新示例 Version onlineVersion = GetOnlineVersion(); Version localVersion = Assembly.GetExecutingAssembly().GetName().Version; if (onlineVersion > localVersion) { if (MessageBox.Show("发现新版本,是否更新?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { DownloadAndUpdate(onlineVersion); } }

6. 扩展开发思路

6.1 支持更多统计维度

现有工具可以扩展支持:

  • 按行政区划分级统计
  • 时点变更统计(对比二调与三调数据)
  • 地类转换矩阵分析

6.2 集成到ArcGIS Pro功能区

将工具集成到更合适的位置:

<insertPanel id="AnalysisPanel" position="last"> <button refID="StatisticsSD_Button" /> </insertPanel>

6.3 云端部署方案

考虑将核心统计逻辑部署为GP服务:

  1. 将统计逻辑封装为GP工具
  2. 发布到ArcGIS Enterprise
  3. 通过REST API调用
# 调用GP服务示例 import arcgis gis = arcgis.GIS("https://yourportal.com", "username", "password") tool = arcgis.features.analysis.Toolbox("https://yourserver/rest/services/StatisticsSD/GPServer") result = tool.execute(params={"input_layer": layer_url, ...})

实际项目中,我发现最常遇到的问题是三调数据标准不统一。有些地区的DLBM字段可能有前缀或后缀,这时需要在SQL筛选前添加字段值清洗逻辑:

// 清洗DLBM字段值 Arcpy.CalculateField(inputLayer, "DLBM_CLEAN", "!DLBM!.strip().replace(' ','').upper()", "PYTHON3");

另一个实用技巧是在工具执行时显示进度条,提升用户体验:

using (var progressor = new Progressor("正在统计三调数据...", "步骤", 7)) { progressor.Current = 1; progressor.Message = "正在汇总初始面积..."; // 执行第一步操作... }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 11:14:45

SonataAdminBundle 与工作流集成:实现复杂业务状态管理

SonataAdminBundle 与工作流集成&#xff1a;实现复杂业务状态管理 【免费下载链接】SonataAdminBundle The missing Symfony Admin Generator 项目地址: https://gitcode.com/gh_mirrors/so/SonataAdminBundle SonataAdminBundle 作为 Symfony 的强大管理后台生成器&am…

作者头像 李华
网站建设 2026/4/29 11:10:30

终极指南:3步永久备份QQ空间青春记忆的Python神器

终极指南&#xff1a;3步永久备份QQ空间青春记忆的Python神器 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory是一款专业的QQ空间数据备份工具&#xff0c;能够帮助您完…

作者头像 李华
网站建设 2026/4/29 11:06:25

终极Android虚拟定位指南:10分钟掌握FakeLocation应用级位置伪装

终极Android虚拟定位指南&#xff1a;10分钟掌握FakeLocation应用级位置伪装 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 还在为社交软件暴露真实位置而烦恼吗&#xff1f;想为…

作者头像 李华