【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表

2023-10-10 21:20

本文主要是介绍【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本工具的作用是将现状用地或规划用地导出Excel格式的用地用海汇总表。

实现这个功能的Arcpy脚本工具我之前已经做过,详见:ArcGisPro脚本工具【8】——用地图斑导出用地用海汇总表

这次试着在ArcGIS Pro SDK中来实现同样的功能。


一、要实现的功能

如上图如示,点击【用地用海汇总表】按钮,选择用地图层、用地编码、要导出保存的汇总表位置,以及要汇总的类型【大类、中类、小类】,点击执行即可。

输入的用地图层如下:

输出的Excel表如下:


二、实现流程

1、准备Excel模板

最终要导出的汇总表是Excel格式的,如果在代码中新建表格,再设置表中的格式,是很麻烦而且低效的,所以这里采用Exce模板的方式,缺点就是需要先准备一个Excel模板。

以小类模板为例:

在模板表格设计时,用地面积列是写入列,参照列是用地代码列。但是部分用地代码单元格是合并格,不方便取值,这里在最右边复制了几个不含合并格的代码列,作为数据输入的参照列,计算完成后就删掉。

占总面积比例列则采用Excel内置的公式进行计算,那当然也可以在代码中计算,但是会多耗费时间,感觉没有必要,Excel在这方面也很强的。

2、主要流程代码

工具的流程代码是挺长的,但是其实也都是业务代码,如果把功能实现的流程细分,基本在以前的文章中都出现过,这里更多的是一个代码的整合。

以小类统计为例,主流程功能块如下:

// 复制嵌入资源中的Excel文件
CopyResourceFile(@"StatisticsYDYH.【模板】用地用海_小类.xlsx", textExcelPath.Text);
// 生成地类编码
CreateYDYHBM(combox_fc.Text, combox_bmField.Text, model, true);
// 汇总大、中、小类
MultiStatistics(combox_fc.Text, output_table, statistics_fields, bm3, "合计", 1, true);
// 将映射属性表中获取字典Dictionary
Dictionary<string, string> dict = await QueuedTask.Run(() => GetDictFromTable("output_table", @"分组字段", "SUM_Shape_Area"));
// 属性映射大类
ExcelAttributeMapper(textExcelPath.Text + @"\用地用海$", 8, 6, dict, 5);
// 属性映射中类
ExcelAttributeMapper(textExcelPath.Text + @"\用地用海$", 9, 6, dict, 5);
// 属性映射小类
ExcelAttributeMapper(textExcelPath.Text + @"\用地用海$", 10, 6, dict, 5);
// 删除0值行
Delete0Row(textExcelPath.Text + @"\用地用海$", 6, 5);
// 删除指定列
DeleteColumns(textExcelPath.Text + @"\用地用海$", new List<int>() { 10, 9,8});

(1)复制嵌入资源中的Excel文件

这里复制的就是Excel模板,在文章后面放出的工程文件里可以看到:

具体实现方式查看之前的文章:

【ArcGIS Pro二次开发】(23):用地编码和用地名称的规范性检查

(2)生成分级用地编码和名称

按大、中、小类生成分级的用地编码,为后续的面积统计提供参照字段。方法详见:

【ArcGIS Pro二次开发】(22):生成分级用地编码和名称

(3)用地用海面积汇总

这里的汇总方式算是GP汇总工具的加强版,正常汇总工具的结果如下:

我所需要的汇总如果如下:

大、中、小三类一起汇总,并且再加一个总量的行,另外再将结果的单位转换为公顷。具体代码如下:

                List<string> list_table = new List<string>();for (int i = 0; i < case_fields.Count; i++){AStatistics(in_table, out_table + i.ToString(), statistics_fields, case_fields[i]);    // 调用GP工具【汇总】AlterField(out_table + i.ToString(), case_fields[i], @"分组字段", @"分组字段");  // 调用GP工具【更改字段】list_table.Add(out_table + i.ToString());}AStatistics(in_table, out_table + "_total", statistics_fields, "");    // // 调用GP工具【更改字段】AddField(out_table + "_total", @"分组字段", "TEXT");    // 调用GP工具【添加字段】CalculateField(out_table + "_total", @"分组字段", "\""+ total_field + "\"");    // 调用GP工具【计算字段】list_table.Add(out_table + "_total");     // 加入列表// 合并汇总表Merge(list_table, out_table, is_output);       // 调用GP工具【合并】// 转换为公顷if (unit > 0){ChangeUnit(out_table, "SUM_Shape_Area", unit);        // 单位转换}

单位转换这里单独定义了一个方法:

        // 表中的值从平方米改为公顷、平方公里或亩public static void ChangeUnit(string in_data, string field, int unit = 1){// 选择修改的单位double cg = 10000;          // 公顷if (unit == 2){cg = 1000000;        // 平方公里}else if (unit == 3){cg = 666.66667;       // 亩}// 单位换算CalculateField(in_data, field, "!" + field + "!/" + cg.ToString());}

(4)属性映射,将汇总表的值写入Excel表格

这个功能专门写过一篇文章,参看:

【ArcGIS Pro二次开发】(25):属性映射

(5)删除面积为0的行

模板表格的用地代码是齐全的,但实际上一般不可能什么用地都有,所以一定会有一些行上没有面积,这里就需要将这些0值的行删除掉,实现方法参看:

【ArcGIS Pro二次开发】(27):删除Excel表中指定列值为0的行

(6)删除模板文件中作为参照的列

刚才也说到,模板文件里有一些用作参照的用地编码列,计算完成后就可以删掉了:

                    List<int> init_cols = new List<int>(){10,9,8};// 删除指定列for (int i = 0; i < init_cols.Count; i++){worksheet.Columns[init_cols[i]].Delete();}

以上便完成了工具的主要功能,可以看出,基本上就是套用之前写过的代码,新写的代码其实并不多。

PS:慢慢的我发觉,写代码其实也没那么多高大上的东西,一些基础的轮子造完后,后面基本就是在拼拼凑凑,能实现功能就可以了。当然,那些大神们的神奇算法,开发模式等,目前还是完全没摸到门槛,这也是有生之年系列了。


三、工程文件分享

 最后,放上工程文件的链接:

StatisticsYDYHicon-default.png?t=N3I4https://pan.baidu.com/s/13xnaamiLvzTqa-Yc2PjQmg?pwd=9470

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

这篇关于【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183164

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

最便宜的8口2.5G网管交换机! 水星SE109 Pro拆机测评

《最便宜的8口2.5G网管交换机!水星SE109Pro拆机测评》水星SE109Pro价格很便宜,水星SE109Pro,外观、接口,和SE109一样,区别Pro是网管型的,下面我们就来看看详细拆... 听说水星SE109 Pro开卖了,PDD卖 220元,于是买回来javascript拆机看看。推荐阅读:水

java poi实现Excel多级表头导出方式(多级表头,复杂表头)

《javapoi实现Excel多级表头导出方式(多级表头,复杂表头)》文章介绍了使用javapoi库实现Excel多级表头导出的方法,通过主代码、合并单元格、设置表头单元格宽度、填充数据、web下载... 目录Java poi实现Excel多级表头导出(多级表头,复杂表头)上代码1.主代码2.合并单元格3.

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

MySQL使用mysqldump导出数据

mysql mysqldump只导出表结构或只导出数据的实现方法 备份数据库: #mysqldump 数据库名 >数据库备份名 #mysqldump -A -u用户名 -p密码 数据库名>数据库备份名 #mysqldump -d -A --add-drop-table -uroot -p >xxx.sql 1.导出结构不导出数据 mysqldump --opt -d 数据库名 -u

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi