【ArcGIS Pro二次开发】(25):属性映射

news2025/1/15 23:41:24

属性映射经常用于属性表或Excel表的赋值,比如按用地用海表对规划用地的用地编码或用地名称赋值,将汇总好的用地指标表赋值给已经制好的Excel模板等。

下面试着在ArcGIS Pro SDK中实现功能上述这两个功能。


一、Excel表格映射到属性表Table

1、要实现的效果

如上图所示,打开【Excel表格映射到Table】工具框,选择输入的要素图层,如【规划用地】,接着输入参照字段和映射字段,最后打开用来映射的Excel表,注意这里打开的Excel表是到【sheet】级的。

点击执行,效果如下:

生成结果中,映射字段会按照映射表的对应键值一一赋值,如果参照字段不在映射表中,则不赋值。

2、实现流程

这里主要是采用几个GP工具【连接字段、计算字段】来实现的,核心步骤和代码如下:

首先需要获取Excel表中的2个表头,即字段名:

            
            // 参数获取
            string map_tabel = textExcelPath.Text;
            string in_data = combox_fc.Text;
            string in_field = combox_bmField.Text;
            string map_field = combox_bmField_Copy.Text;
            // 获取连接表的2个字段名
            string exl_field01 = GetCellFromExcel(map_tabel, "A1");
            string exl_field02 = GetCellFromExcel(map_tabel, "B1");
            List<string> fields = new List<string>() { exl_field02 };

        // 从Excel文件中获取Cellvalue
        public static string GetCellFromExcel(string excelPath, string range)
        {
            // 建立 Excel 应用程序对象
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            // 获取Excel文件名和表名
            List<string> files = DecomposeExcel(excelPath);
            string excel_name = files[0];
            string sheet_name = files[1];
            // 打开 Excel 文件
            Workbook workbook = excelApp.Workbooks.Open(excel_name);
            // 获取工作表
            Worksheet worksheet = workbook.Worksheets[sheet_name];

            // 获取单元格
            string Cellvalue = worksheet.Range[range].Value.ToString();

            //  保存并关闭 Excel 文件和应用程序对象
            workbook.Close(true);
            excelApp.Quit();
            // 返回value
            return Cellvalue;
        }

这里还调用了一个方法【DecomposeExcel】,用于把输入的Excel文件分解为文件名和表名,代码如下:

        // 分解Excel的文件名和表名
        public static List<string> DecomposeExcel(string excelPath)
        {
            // 设置空列表
            List<string> list = new List<string>();
            // 获取最后一个"\"的位置
            int index = excelPath.LastIndexOf("\\");
            // 获取exl文件名
            string excel_name = excelPath.Substring(0, index);
            // 获取表名
            string sheet_name = excelPath.Substring(index + 1, excelPath.Length - index - 2);
            // 将exl文件名和表名加入列表
            list.Add(excel_name);
            list.Add(sheet_name);
            // 返回列表
            return list;
        }

然后调用GP工具【连接字段】,以参照字段为连接字段,将Excel表连接至属性表中:

        // 连接字段
        JoinField(in_data, in_field, map_tabel, exl_field01, fields);

        // 连接字段
        public static async void JoinField(string in_data, string in_field, string join_table, string join_field, List<string> fields, bool isOutput = false)
        {
            // 设置默认GPExecuteToolFlags
            GPExecuteToolFlags executeFlags = GPExecuteToolFlags.AddToHistory;
            if (isOutput)
            {
                executeFlags = GPExecuteToolFlags.AddToHistory | GPExecuteToolFlags.AddOutputsToMap;
            }
            // 执行GP工具
            var par_JoinField = Geoprocessing.MakeValueArray(in_data, in_field, join_table, join_field, fields, "NOT_USE_FM", "");
            await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.JoinField", par_JoinField, null, null, null, executeFlags));
        }

调用GP工具【计算字段】,将连接到属性表里的目标字段赋值给属性表里的映射字段:

        // 计算字段
        CalculateField(in_data, map_field, "!" + exl_field02 + "!");
        // 计算字段
        public static async void CalculateField(string in_data, string field, string expression, bool isOutput = false)
        {
            // 设置默认GPExecuteToolFlags
            GPExecuteToolFlags executeFlags = GPExecuteToolFlags.AddToHistory;
            if (isOutput)
            {
                executeFlags = GPExecuteToolFlags.AddToHistory | GPExecuteToolFlags.AddOutputsToMap;
            }
            // 执行GP工具
            var par_CalculateField = Geoprocessing.MakeValueArray(in_data, field, expression, "PYTHON3", "", "", "NO_ENFORCE_DOMAINS");
            await QueuedTask.Run(() => Geoprocessing.ExecuteToolAsync("management.CalculateField", par_CalculateField, null, null, null, executeFlags));
        }

赋完值,顺便还可以删掉连接进来的字段。

以上便实现了将Excel表格映射到Table的功能。


二、属性表Table映射到Excel表格

1、要实现的效果

如上图所示,打开【Table映射到Excel表格】工具框,选择要赋值的Excel表,输入参照列和映射列(例子中是第1列和第2例),然后输入表格Table(例子里是一个汇总统计表),再输入参照字段和映射字段。

点击执行,效果如下:

生成结果中,Excel表格会根据汇总表的值进行填写,如果汇总表中没有相应的参照字段,则不会填写。

这个工具用处是很多的,例如生成【用地用海表,村庄结构功能表……】等一系列表格。

2、实现流程

第一步要从属性表Table中将对应的键值提取出来,输出一个字典,方便后面使用:

                // 参数获取
                string map_tabel = combox_table.Text;
                string in_field = combox_bmField_in.Text;
                string map_field = combox_bmField_map.Text;
                string excelPath = textExcelPath.Text;
                int sheet_in_col = int.Parse(txtbox01.Text);
                int sheet_map_col = int.Parse(txtbox02.Text);

                // 将映射属性表中获取字典Dictionary
                Dictionary<string, string> dict = await QueuedTask.Run(() => GetDictFromTable(map_tabel, in_field, map_field));

        // 从Table中获取Dictionary
        public static async Task<Dictionary<string, string>> GetDictFromTable(string in_table, string in_field_01, string in_field_02)
        {
            Dictionary<string, string> dict = new();
            // 根据图层名找到当前图层
            var map = MapView.Active.Map;
            StandaloneTable initlayer = map.FindStandaloneTables(in_table)[0];
            await QueuedTask.Run(() =>
            {
                using (ArcGIS.Core.Data.Table table = initlayer.GetTable())
                {
                    using (RowCursor rowCursor = table.Search(null, false))
                    {
                        TableDefinition tableDefinition = table.GetDefinition();
                        while (rowCursor.MoveNext())
                        {
                            using (Row row = rowCursor.Current)
                            {
                                // 获取value
                                var key = row[in_field_01].ToString();
                                var value = row[in_field_02].ToString();
                                // 如果没有重复key值,则纳入dict
                                if (!dict.Keys.Contains(key))
                                {
                                    dict.Add(key, value);
                                }
                            }
                        }
                    }
                }
            });
            return dict;
        }

获取用来映射的字典后,就可以打开Excel文件进行赋值了。同样的,这里还是要先把Excel文件名进行一个分解:

                // 建立 Excel 应用程序对象
                Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

                // 获取Excel文件名和表名
                List<string> files = DecomposeExcel(excelPath);
                string excel_name = files[0];
                string sheet_name = files[1];
                // 打开 Excel 文件
                Workbook workbook = excelApp.Workbooks.Open(excel_name);
                // 获取工作表
                Worksheet worksheet = workbook.Worksheets[sheet_name];

                // 获取Excel表格中的数据,将特定列作为值
                for (int row = 1; row <= worksheet.UsedRange.Rows.Count; row++)
                {
                    // 获取对照值
                    string in_value = worksheet.Cells[row, sheet_in_col].Value.ToString();
                    // 赋值
                    if (dict.Keys.Contains(in_value))
                    {
                        worksheet.Cells[row, sheet_map_col].Value = dict[in_value];
                    }
                }
                //  保存并关闭 Excel 文件和应用程序对象
                workbook.Close(true);
                excelApp.Quit();

以上便实现了将Table映射到Excel表格的功能。

完整代码可以查看文章末尾放出的工程文件。


三、工程文件分享

 最后,放上工程文件的链接:

AttributeMappericon-default.png?t=N3I4https://pan.baidu.com/s/1J79C5Qr7ClEyq5mrf12I9g?pwd=dqpjPS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

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

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

相关文章

VMware虚拟机安装CentOS8详细教程

文章目录 一、下载安装包二、创建虚拟机1.安装 VMware2.创建虚拟机3.编辑虚拟机设置 三、系统安装1.开始安装2.时区设置3.分区设置4.配置网络6.开机密码7.配置安装源8.安装 四、系统配置1.网络检查2.配置静态IP地址 一、下载安装包 CentOS-7-x86_64【Minimal版】 https://mirro…

程序员必知必会!阿里内部热捧“Spring全线笔记”太完整了

前言 对于每一位Java开发人员来说&#xff0c;提起Spring定是不陌生的&#xff0c;实际上自Spring框架诞生以来&#xff0c;就备受开发者的青睐&#xff0c;基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等&#xff0…

OpenGL光照教程之 光照贴图

引言 前面的教程&#xff0c;我们讨论了让不同的物体拥有各自不同的材质并对光照做出不同的反应的方法。在一个光照场景中&#xff0c;让每个物体拥有和其他物体不同的外观很棒&#xff0c;但是这仍然不能对一个物体的图像输出提供足够多的灵活性。  前面的教程中我们将一个物…

关于FPGA基础知识 LCMXO2-7000HC-4TG144C MachXO2系列 FPGA可编程逻辑简介

关于FPGA基础知识 LCMXO2-7000HC-4TG144C lattice莱迪斯深力科 MachXO2系列 FPGA可编程逻辑简介 FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一…

【测评】飞凌i.MX8MM开发板,为你带来卓越的影音体验

来源&#xff1a;飞凌嵌入式官网 OKMX8MM-C是飞凌基于NXP公司i.MX8M Mini 四核64位处理器所设计的一款开发板&#xff0c;主频最高达1.8GHz&#xff0c;可提供多种音频接口&#xff0c;包括I2S、AC97、TDM、PDM和SPDIF。在性能和算力都大幅提高的同时&#xff0c;系统的运行也更…

idea配置Tomcat服务和创建javaweb项目

前言 我的idea版本是Ultimate 2022.3 步骤 1.先创建一个空的java项目 2.点击project structure 然后点击moudle – > dependcies —>点&#xff0b; 选择JArs or … 找到你安装的tomcat里面的lin依次添加jsp-api.jar、servlet-api.jar 右击项目然后点add Framework s…

SPSS如何进行生存分析之案例实训?

文章目录 0.引言1.寿命表分析2.Kaplan-Meier分析方法3.Cox回归分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对生存分析进行阐…

JVM虚拟机中的类加载机制和双亲委派模型

目录 虚拟机的类加载机制 名词解释 类加载的时机 类加载的过程 1.加载&#xff08;Loading&#xff09;阶段 非数组类型的加载阶段与数组类型区别 2.验证&#xff08;Verification&#xff09;阶段 1&#xff09;文件格式验证 2&#xff09;元数据验证 3&#xff09;…

深入理解Java虚拟机——对象的创建和内存布局

1.对象的创建 首先声明这一篇博客是在HotSpot虚拟机的前提之下记录的。主要参考书籍来源于周志明老师的《深入理解JVM虚拟机》。 在语言层面&#xff0c;创建对象仅仅是使用一个new关键字。但是从虚拟机的角度来看&#xff0c;创建一个对象一共有5个步骤&#xff1a;类加载检查…

排序大师:探秘C语言中神奇的qsort库函数

本篇文章中会详细讲解C语言中的qsort库函数。我准备分2个方面来讲&#xff1a; qsort如何使用。模拟实现qsort的效果。&#xff08;注意&#xff1a;只是用冒泡排序的思想实现类似的效果&#xff0c;实际qsort的底层采用的是快速排序的思想。&#xff09; 如何使用 先来看看q…

反调试与反反调试

参考文本 (190条消息) C 反反调试&#xff08;NtQueryInformationProcess&#xff09;_(-: LYSM :-)的博客-CSDN博客 Windows 平台反调试相关的技术方法总结—part 2 - 先知社区 C/C MinHook 库的使用技巧 - lyshark - 博客园 (cnblogs.com) (177条消息) C 反反调试&#x…

C结构简单而不失强大的表格

2023年了&#xff0c;想必已经不会有人对嵌入式开发中“数据结构&#xff08;Data Structure&#xff09;”的作用产生疑问了吧&#xff1f;无论你是否心存疑惑&#xff0c;本文都将给你一个完全不同的视角。 每每说起数据结构&#xff0c;很多人脑海里复现的一定是以下的内容&…

unity中用异步的whenAny,实现:当点击铲子任一部件,拾取整个铲子

一、铲子的组成 铲子包含很多部件组成&#xff0c;当拾取铲子的时候&#xff0c;只要点击铲子的任意一个部件就可以。 如图&#xff0c;点击【木柄】、【螺母】、【铁铲】都可以拾取该物体。 &#xff08;1&#xff09;打开高亮 &#xff08;2&#xff09;等待土铲被点击&…

为什么要通过API接口来获取数据

API接口&#xff08;应用编程接口 application/programming接口&#xff09;&#xff0c;准许应用程序通过定义的接口标准来访问另一个应用程序或服务的编程方式。简单来说&#xff0c;API就是两个软件或系统之间的通信语言或接口。 在当今的互联网时代&#xff0c;数据无处不…

Geospatial和Redis事务操作

一、Geospatial 1.简介 基于位置信息服务 (Location-Based Service,LBS) 的应用。 Redis3.2 版本后增加了对 GEO 类型的支持。主要来维护元素的经纬度。redis 基于这种类型&#xff0c;提供了经纬度设置、查询、范围查询、距离查询、经纬度hash等一些相关操作。 2.GEO底层结构…

DataEase 数据源插件分享 - 时序数据库 InfluxDB

前言 InfluxDB 是一个时序数据库&#xff0c;使用的是非标准的 SQL 语法&#xff0c;我使用 DataEase 的插件扩展机制开发了此数据源插件&#xff0c;在这里共享出来&#xff0c;想用的朋友可以下载安装使用。 插件包下载地址 https://north-dataease-1251506367.cos.ap-bei…

Centos 7.X WordPress博客网站详细教程 FTP/PHP/mysql/Apache环境构建

此教程适用于服务器系统为centos 7.x&#xff0c;php安装版本为7.4&#xff0c;mysql安装本部为5.7. 一、mysql安装 1.1 安装三个工具 yum install wget yum install vim yum install unzip 1.2 下载并安装msql 在线下载安装包&#xff1a; wget https://dev.mysql.com/g…

JZS-7/221静态可调延时中间继电器 JOSEF约瑟

JZS-7/2系列静态可调延时中间继电器品牌&#xff1a;JOSEF约瑟型号&#xff1a;JZS-7/2名称&#xff1a;静态可调延时中间继电器额定电压&#xff1a;48380V触点容量&#xff1a;10A/250V返回系数&#xff1a;≤15%延时范围&#xff1a;15ms3s15ms5s15ms10s JZS-7/2系列静态可…

SQL中使用的运算符号详解

文章目录 前言1. 算术运算符加法与减法运算符乘法与除法运算符求模&#xff08;求余&#xff09;运算符 2. 比较运算符1&#xff0e;等号运算符2&#xff0e;安全等于运算符3&#xff0e;不等于运算符4. 空运算符5. 非空运算符6. 最小值运算符7. 最大值运算符8. BETWEEN AND运算…

射频功率放大器(RF PA)线性化技术及分类介绍

基本概念 射频功率放大器(RF PA)是发射系统中的主要部分&#xff0c;其重要性不言而喻。在发射机的前级电路中&#xff0c;调制振荡电路所产生的射频信号功率很小&#xff0c;需要经过一系列的放大&#xff08;缓冲级、中间放大级、末级功率放大级&#xff09;获得足够的射频功…