【ArcGIS Pro二次开发】(77):ArcGIS Pro中图层的获取与解析

一、最简单的获取图层方式

通常情况下,如果要获取当前地图中的图层,可以用2种方法获取。

以下图为例:

一种是【map.Layers】属性获取,结果如下:

可以看出,这里只获取到了第一层级的图层,图层组下面的二级图层被忽略了,显然这不是我们想要的。

另一种是通过map.GetLayersAsFlattenedList()方法获取,结果如下:

这次的结果,不管是第一层级还是第二层级的图层都得到了。

但美中不足的是,图层的结构被打散了,比如说【FW】图层,实际是【新建图层组】下的图层,正确的表达为【新建图层组\FW】。

为什么说这才是正确的表达,如果你用过GP工具就会发现,输入数据是图层的话,只有【新建图层组\FW】这种表达方式才是正确的,如果输入的是【FW】,将是无效的输入。

那边,下一步要做的就是获取图层完整的路径结构。


二、获取图层完整的路径结构

由于SDK没有提供获取图层完整路径结构的接口,那么这个事情就只能自己动手了。

思路其实也不难,就是通过获取图层的父图层,然后把父图层的名字加到结果中就行了,直到父图层是地图为止。

代码如下:

// 获取图层的完整名称
public static List<object> GetLayerFullName(this Object layer, Map map, string lyName)
{
    List<object> result = new List<object>();
    // 如果是图层
    if (layer is Layer)
    {
        // 如果父对象是Map,直接返回图层名
        if (((Layer)layer).Parent is Map)
        {
            result.Add(layer);
            result.Add(lyName);
            return result;
        }
        else
        {
            // 如果父对象是不是Map,则找到父对象图层,并循环查找上一个层级
            Layer paLayer = (Layer)((Layer)layer).Parent;
            List<object> list = paLayer.GetLayerFullName(map, @$"{paLayer}\{lyName}");
            return list;
        }
    }
    // 如果是独立表
    else if (layer is StandaloneTable)
    {
        // 如果父对象是Map,直接返回图层名
        if (((StandaloneTable)layer).Parent is Map)
        {
            result.Add(layer);
            result.Add(lyName);
            return result;
        }
        else
        {
            // 如果父对象是不是Map,则找到父对象图层,并循环查找上一个层级
            Layer paLayer = (Layer)((StandaloneTable)layer).Parent;
            List<object> list = paLayer.GetLayerFullName(map, @$"{paLayer}\{lyName}");
            return list;
        }
    }
    else
    {
        return null;
    }
}

这里先把图层组排除,只考虑一般图层的情况,获取的图层列表如下:

OK,正是想要的结果。

但是,其实这还并不完美,因为这里没有考虑到更复杂的情况,比如说同名图层。稍微调整一下:

再试一下上面的方法,导出结果为:

可以看到,同名图层都被列入列表,但是名称都一样。如果这时候将其作为输入数据,系统就无法认出到底该用哪一个,就只会将第一个作为输入数据,这显然也不是我们想要的。

于是我们要做的是,给这些同名图组作一个标记,作为输入数据的标识。


三、标识同名图层

在我们获取到图层列表后,就可以对列表进行处理。

这里用到的方法是,新建一个字典,用来记录列表中每条记录的出现次数,然后按出现的先后用数字后缀给它标记。

然后再找出只有一个记录,也就是没有同名的图层,把它的【1】的标记去掉就可以了。

代码如下:

// 对重复要素进行数字标记
public static List<string> AddNumbersToDuplicates(this List<string> stringList)
{
    // 使用Dictionary来跟踪每个字符串的出现次数
    Dictionary<string, int> stringCount = new Dictionary<string, int>();
    // 遍历字符串列表
    for (int i = 0; i < stringList.Count; i++)
    {
        string currentString = stringList[i];
        // 检查字符串是否已经在Dictionary中存在
        if (stringCount.ContainsKey(currentString))
        {
            // 获取该字符串的出现次数
            int count = stringCount[currentString];
            // 在当前字符串后添加数字
            stringList[i] = $"{currentString}:{count + 1}";
            // 更新Dictionary中的计数
            stringCount[currentString] = count + 1;
        }
        else
        {
            // 如果字符串在Dictionary中不存在,将其添加,并将计数设置为1
            stringCount.Add(currentString, 1);
            // 在当前字符串后添加数字
            stringList[i] = $"{currentString}:{1}";
        }
    }
    // 去除单个要素的数字标记
    foreach (var item in stringCount)
    {
        if (item.Value == 1)
        {
            for (int i = 0; i < stringList.Count; i++)
            {
                if (stringList[i] == item.Key + ":1")
                {
                    stringList[i] = item.Key;
                }
            }
        }
    }
    // 返回字符串列表
    return stringList;
}

运行后结果如下:

可以看到,同名图层的后面加上了数字标记,OK,大功造成。

.......并没有。

虽然标记出来了,但是如果在使用GP工具的时候,输入的是【规划用地:1】这样的字符串,也是无效的。

这时候就要转换一下思路了,GP工具输入的不仅可以是字符串,也可以是图层。因此我们要做的是将上面的字符串还原成图层。


四、将图层名字符串还原成图层

首先解释下为什么要这么麻烦,先获取图层名,再还原成图层,进行GP运算,直接将获取的图层作为输入数据不行吗?

这是因为在工具中,经常需要用户手动选择图层,而真正执行的流程是在按下执行键后才进行的,并不在同一个进程中。 

现在的问题是怎么让上面获取到的图层名和它的实际图层一一对应上。

很简单,再来一遍查找图层就行了, 不过这次,我们不仅要获取完整图名,同时也要获取它的原始图层。

这里用一个字典来收集。代码如下:

// 获取地图中的所有要素图层【带图层结构】【字典】
public static Dictionary<FeatureLayer, string> AllFeatureLayersDic(this Map map)
{
    Dictionary<FeatureLayer, string> dic = new Dictionary<FeatureLayer, string>();
    List<string> layers = new List<string>();
    List<FeatureLayer> lys = new List<FeatureLayer>();
    // 获取所有要素图层
    List<FeatureLayer> featureLayers = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().ToList();

    foreach (FeatureLayer featureLayer in featureLayers)
    {
        List<object> list = featureLayer.GetLayerFullName(map, featureLayer.Name);

        layers.Add((string)list[1]);
        lys.Add(featureLayer);
    }
    // 标记重复
    layers.AddNumbersToDuplicates();
    // 加入字典
    for (int i = 0; i < lys.Count; i++)
    {
        dic.Add(lys[i], layers[i]);
    }
    // 返回值
    return dic;
}

获取字典后,对着图层名找到图层即可:

// 查找要素图层
foreach (var layer in dicFeatureLayer)
{
    if (layerFullName == layer.Value)
    {
        result.Add(layer.Key);
    }
}

OK,这次是大功告成了,完美闭环。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet&#xff08;《Very Deep Convolutional Networks For Large-Scale Image Recognition》&#xff09;&#xff0c;就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军&#xff0c;相比于AlexNet&am…

inBuilder低代码平台新特性推荐-第九期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第九期——子表弹出新增&#xff01; 01 概述 子表弹出新增&#xff0c;是低代码平台提供的一种前端输入组件&#xff0c;在子表字段较多的场景中&#xff0c;有时为了方便…

代码随想录刷题】Day16 二叉树03

文章目录 1.【104】二叉树的最大深度&#xff08;优先掌握递归&#xff09;1.1 前言1.2 题目描述1.3 递归法java代码实现1.4 迭代法java代码实现1.5 相关练习题【559】N叉树的最大深度 2.【111】二叉树的最小深度&#xff08;优先掌握递归&#xff09;2.1 题目描述2.2 递归法ja…

智能高效的转运机器人,为物流行业注入新动力

在当今社会&#xff0c;随着科技的不断发展&#xff0c;机器人已经逐渐融入到我们的生活中。其中&#xff0c;转运机器人作为物流行业的新秀&#xff0c;正以其高效、智能的特点&#xff0c;引起了广泛的关注。 转运机器人&#xff0c;是指能够自主进行物品搬运和运输的机器人…

说一下类的生命周期

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前&#xff0c;生成式 AI 正受到公众的广泛关注&#xff0c;人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息&#xff0c;本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI&#xff0c;提供了…

京东数据分析软件(京东平台数据分析):2023年Q3扫地机器人行业消费报告

随着90后、00后逐渐成为消费主力军&#xff0c;他们对生活品质更加关注、健康意识进一步增强&#xff0c;再加上“懒人经济”的盛行&#xff0c;人们对扫地机器人的使用率和关注热情也不断增长。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份-9月份&#xf…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip&#xff08;方便ssh连接&#xff09;五、yum源有问题参考文档 一、安装包下载 CentOS 网站&#xff1a; https://www.centos.org/CentOS 维基&#xff1a; https://wiki.cen…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址&#xff1a;https://hugegraph.apache.org/ 环境为&#xff1a;linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

xss-labs靶场1-5关

文章目录 前言一、靶场需要知道的前置知识点1、什么是xss攻击&#xff1f;2、xss攻击分为几大类1、反射型xss2、存储型xss3、dom型xss 3、xss攻击形成的条件 二、xss-labs关卡1-51、关卡12、关卡23、关卡34、关卡45、关卡5 总结 前言 此文章只用于学习和反思巩固xss攻击知识&a…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

如何在IAR软件中使用STLINK V2编译下载和调试stm8单片机

安装使用IAR后&#xff0c;如使用系统默认设置&#xff0c;往往很难正常实现用stlink v2来下载和调试stm8芯片&#xff0c;我的解决方法如下&#xff1a; 1、打开项目的options菜单&#xff1a; 2、在项目的选项菜单中选择ST-LINK作为调试工具&#xff1a; 3、选择额外的输出…

六、程序员指南:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

1、数仓模型概述

1、问&#xff1a;什么是数据模型&#xff1f; 数仓领域中的模型指的是数据模型&#xff0c;要和商业分析中的模型不同 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用的角度合理的存储数据 2、问&#xff1a;模型和表的区别&#xff1f; 表是数据物…

只有Target才有PDB

中间的OBJ的debug信息是放在Target里了。

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…