您现在的位置是:首页 >学无止境 >【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表网站首页学无止境
【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表格
这个功能专门写过一篇文章,参看:
(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:慢慢的我发觉,写代码其实也没那么多高大上的东西,一些基础的轮子造完后,后面基本就是在拼拼凑凑,能实现功能就可以了。当然,那些大神们的神奇算法,开发模式等,目前还是完全没摸到门槛,这也是有生之年系列了。
三、工程文件分享
最后,放上工程文件的链接:
StatisticsYDYHhttps://pan.baidu.com/s/13xnaamiLvzTqa-Yc2PjQmg?pwd=9470
PS:可以直接点击...binDebug et6.0-windows下的.esriAddinX文件直接安装。