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

news2025/1/18 17:04:51

本工具的作用是将现状用地或规划用地导出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文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【存储数据恢复】H3C存储卷中的数据恢复案例

存储数据恢复环境&故障&#xff1a; H3C FlexStorage某型号存储&#xff0c;25块磁盘组建的RAID5&#xff0c;其中包含一块热备盘。 工作人员误操作将存储设备中原先的2个卷删除&#xff0c;删除之后又使用和删除2个卷同样大小的空间重建了一个卷。用户希望恢复删除的2个卷…

springboot缓存

1. 认识缓存 一级缓存 - 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质 - 使用缓存可以有效的减少低速数据读取过程的次数&#xff0c;提高系统性能 Service public class BookServiceImplCache implements BookService {Autowiredprivate BookDao book…

玩转服务器之环境篇:PHP和Python环境部署指南 | 京东云技术团队

前几篇文章中讲解了如何搭建docker和Java Web环境的方法&#xff0c;本篇文章来教大家搭建一个好的PHP和Python环境&#xff0c;可以帮助开发和运行PHP和Python应用程序&#xff0c;使其更加高效和稳定。 一、 PHP环境介绍 好的开发环境无疑会大大提升编码效率&#xff0c;近…

搭载RK3588的Orange Pi 5 Plus来了!首发“亲民价”649元起!

Orange Pi 5 Plus来了。令人惊艳的Orange Pi 5 家族将又添一个重量级新成员! 作为香橙派首款搭载瑞芯微RK3588的开发板&#xff0c;Orange Pi 5 Plus将成为顶级高性能开发板的臻选。先说几个令人惊艳的亮点&#xff1a;两个PCIe扩展的2.5G以太网接口&#xff1b;eMMC 闪存插座…

黑马Redis笔记高级篇 | 分布式缓存

黑马Redis笔记高级篇 | 分布式缓存 1、Redis持久化&#xff08;解决数据丢失&#xff09;1.1 RDB持久化1.1.1 定义1.1.2 异步持久化bgsave原理 1.2 AOF持久化1.3 RDB和AOF比较 2、Redis主从&#xff08;解决并发问题&#xff09;2.1 搭建主从架构2.2 主从数据同步原理2.2.1 全量…

这样连交换机和路由器,多少网工没试过?

大家好&#xff0c;我是老杨。 交换机已经说过很多遍了&#xff0c;园区组网案例、交换机级联、光模块配件解读等等…… 有群友说想要看更多的配置案例&#xff0c;这次就给你说说&#xff0c;交换机和路由器对接上网配置。 还搞不明白交换机和路由器的&#xff0c;复习一下…

webpack开发服务器配置

&#x1f482; 个人网站:[【紫陌】【笔记分享网】](http://zimo.aizhaiyu.com/) &#x1f485; 想寻找共同学习交流、共同成长的伙伴&#xff0c;[请点击【前端学习交流群】](http://zimo.aizhaiyu.com/wechat/wechat.html) 文章最后有作者l联系方式&#xff08;备注进群&am…

写给程序员Android Framework 开发,

前言 在 Android 开发者技能中&#xff0c;如果想进大厂&#xff0c;一般拥有较好的学历可能有优势一些。但是如果你靠硬实力也是有机会的&#xff0c;例如死磕Framework。Framework 知识广泛应用在Android各个领域中&#xff0c;重要性显而易见。 成为一名Android Framework…

【2023程序员必看】大数据行业分析

1、政策重点扶持&#xff0c;市场前景广阔 2014年&#xff0c;大数据首次写入政府工作报告&#xff0c;大数据逐渐成为各级政府关注的热点。 2015年9月&#xff0c;国务院发布《促进大数据发展的行动纲要》&#xff0c;大数据正式上升至国家战略层面&#xff0c;十九大报告提…

网络突发环路,原来可以这么解决啊

大家好&#xff0c;我是老杨。 我相信&#xff0c;任何一个网工都遇到过网络环路&#xff0c;遇到这个情况&#xff0c;你的应对方法是什么&#xff1f; 我了解到大部分的初阶网工&#xff0c;最开始都只能用拔插网线和重启观测法来排除回路。 简单来说&#xff0c;就是先给…

下一个超级生态节点openGauss ——鲲鹏开发者峰会2023 openGauss技术专题回顾

摘要 2023年5月6日&#xff0c;一场面向计算产业开发者的技术盛会“ 鲲鹏开发者峰会2023 ”在东莞松山湖正式拉开帷幕&#xff0c;在其中的“openGauss技术专场”上&#xff0c;openGauss相关专家和伙伴围绕openGauss社区进展、openGauss5.0版本技术创新&#xff0c;基于op…

前端开发之函数式编程实践 | 京东云技术团队

作者&#xff1a;京东科技 牛志伟 函数式编程简介 常见应用场景 1、ES6中的map、filter、reduce等函数 [1,2,3,4,5].map(x > x * 2).filter(x > x > 5).reduce((p,n) > p n);2、React类组件 -> 函数式组件hooks、Vue3中的组合式API 3、RxJS、Lodash和Ramd…

震惊!百度搜索地位崩塌,微软Bing和俄罗斯Yandex上升

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 中国的搜索引擎市场正在发生巨变。据美国一家网站流量检测机构StatCounte显示&#xff1a;从2022年到2023年&#xff0c;百度的搜索流量份额急剧下降至39.64%&#xff0c;而微软的Bing和俄罗斯的Ya…

Spring Boot集成ShardingSphere配合dynamic-datasource进行数据源切换 | Spring Cloud 49

一、前言 通过以下系列章节&#xff1a; Spring Boot集成ShardingSphere实现数据分片&#xff08;一&#xff09; | Spring Cloud 40 Spring Boot集成ShardingSphere实现数据分片&#xff08;二&#xff09; | Spring Cloud 41 Spring Boot集成ShardingSphere实现数据分片&…

沉痛悼念互联网[云原生领域]技术大牛----左耳朵耗子(陈皓老师)

陈皓老师&#xff0c;网名"左耳朵耗子"&#xff0c;是一位在互联网界享有盛誉的伟大人物。他的一生充满了创造力、智慧和奉献精神&#xff0c;对技术领域做出了卓越的贡献。 陈皓老师 为什么网名叫 左耳朵耗子? 陈皓老师之所以取名"左耳朵耗子"&#xff…

HDMI接口说明

目录 一、概述 二、信号说明 三、信号定义 四、握手过程 五、调试步骤 一、概述 HDMI ,High-Definition Multimedia Interface,即高清晰度多媒体接口&#xff0c;是电脑、电视等相关显示设备的接口。 二、信号说明 HDMI分为Source,Sink.Source即信号源&#xff0c;为HDMI…

网络基础协议

1、网络协议/TCP/UDP/HTTP 网络协议是指在计算机网络中&#xff0c;不同设备之间进行通信时所使用的规则、约定和标准。常见的网络协议包括TCP协议、UDP协议、HTTP协议等。 TCP协议是一种面向连接、可靠的传输层协议&#xff0c;它提供了可靠的数据传输和数据包检错能力。在网…

新星计划2023【网络应用领域基础】——————Day3

常见的网络基础介绍 前言 我们系数了网络发展的历史和一些常见的协议&#xff0c;以下文章我将详细的讲网络层协议以及用拓扑来解释单臂路由和vlan的划分。结尾将会额外的额解释常见的抓包。 目录 常见的网络基础介绍​ 前言 我们系数了网络发展的历史和一些常见的协议&…

蓝桥杯拿到一等奖,并分享经验

昨天和群里的小伙伴在群里聊&#xff0c;有的小伙伴竟然说蓝桥杯一等奖没有含量&#xff0c;我也是醉了&#xff01; 就像去年看了一个号主写的&#xff1a;研究生遍地都是! 放眼全国14亿人口&#xff0c;别说研究生了&#xff0c;本科生占比有多少? “蓝桥杯是我人生中得到…

移动硬盘中剪切的文件能恢复吗?可尝试这四种方法找回

在使用移动硬盘时&#xff0c;我们所存储的数据很容易出现意外丢失、被删除、受到病毒感染等方方面面的问题。而如果你使用的是剪切操作&#xff0c;而不是复制操作来移动文件&#xff0c;那么在操作过程中很容易因为各种原因导致数据丢失。如果你遇到了这种情况&#xff0c;那…