您现在的位置是:首页 >学无止境 >【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表网站首页学无止境

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

规划GIS会 2024-06-17 11:26:43
简介【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:可以直接点击...binDebug et6.0-windows下的.esriAddinX文件直接安装。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。