【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

相关文章

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为