【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

相关文章

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

MySQL Workbench工具导出导入数据库方式

《MySQLWorkbench工具导出导入数据库方式》:本文主要介绍MySQLWorkbench工具导出导入数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录mysql Workbench工具导出导入数据库第一步 www.chinasem.cn数据库导出第二步

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

售价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总结注:本文章中代码均为