【ArcGIS Pro二次开发】(60):按图层导出布局

在使用布局导图时,会遇到如下问题:

为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。

在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3张图,系统并没有方便的工具。

于是就自己做一个。


一、要实现的功能

 

如上图所示,在【综合应用】组—【制图相关】面板下,点击【按图层导出布局】工具。

在弹出的工具框中,分别输入参数:

1、导出图片的文件夹位置。有记忆功能,会保留上次你填入的路径。

【2、3】、2和3是配合使用的,点击2的下拉框,会列出当前地图的所有图层组和图层,但不包括图层组下的子图层。选择结果会添加到3中。

4、选择3中的选项,点击4,可以将其从3中移除。

5、选择布局视图。默认为工程中的第一个布局,可以修改。

6、图片类型。目前有3种可选。有记忆功能,会保留上次的选择。

7、图片分辨率。有记忆功能,会保留上次你填入的数据。

生成结果如下:


二、实现流程

核心代码如下:

首先需要将当前地图中所有图层的显示信息保存一下,因为工具运行结束后需要恢复图层显示。特别是当你的地图图层非常多的时候,这点尤为重要。

这里需要注意的是,有可能一个同名图层会放在不同的图层组中,如上面的【永久基本农田】就放在了2个图层组中,这里需要获取它的父对象,也就是图层组,一并保存下来。

// 获取当前所有图层显示信息
public static Dictionary<string, bool> GetLayerVisible()
{
    Dictionary<string, bool> dic = new Dictionary<string, bool>();
    // 获取当前地图
    Map map = MapView.Active.Map;
    // 获取所有要素图层
    var lys = map.GetLayersAsFlattenedList().ToList();
    foreach (var ly in lys)
    {
        if (ly.Parent is Map)
        {
            dic.Add(ly.Name, ly.IsVisible);
        }
        else
        {
            dic.Add($"{ly.Parent}+++{ly.Name}", ly.IsVisible);
        }
    }
    return dic;
}

然后获取列表框中选定的所有图层和图层组,进行打印。

这里关于布局导出的详细说明在之前的文章也有提到,就不再细说,注释也写得很清楚了。

foreach (string item in listBox_layer.Items)
{
    pw.AddProcessMessage(20, time_base, "导出图层:" + item);

    // 去掉标签
    string modifyLayer = item.Replace("【组】", "");
    // 获取layout 
    Layout layout = layoutProjectItem.GetLayout();
    // 控制图层显示
    ToolManager.ControlLayer(modifyLayer);

    // JPG图片属性
    JPEGFormat JPG = new JPEGFormat()
    {
        HasWorldFile = true,
        Resolution = dpi,               // 分辨率
        OutputFileName = outputPath + @"\" + modifyLayer + @".jpg",      // 输出路径
    };
    // PNG图片属性
    PNGFormat PNG = new PNGFormat()
    {
        HasWorldFile = true,
        Resolution = dpi,               // 分辨率
        OutputFileName = outputPath + @"\" + modifyLayer + @".png",      // 输出路径
    };
    // PDF图片属性
    PDFFormat PDF = new PDFFormat()
    {
        OutputFileName = outputPath + @"\" + modifyLayer + @".pdf",      // 输出路径
        Resolution = dpi,               // 分辨率
        DoCompressVectorGraphics = true,   // 是否压缩矢量图形
        DoEmbedFonts = true,            // 是否执行嵌入字体         
        HasGeoRefInfo = true,             // 是否具有地理参考信息
        ImageCompression = ImageCompression.Adaptive,   // 图形压缩.自适应
        ImageQuality = ImageQuality.Best,           // 图形质量
        LayersAndAttributes = LayersAndAttributes.LayersAndAttributes   // 图层  属性
    };

    // 导出JPG
    if (pic_type == "jpg")
    {
        layout.Export(JPG);
    }
    // 导出PNG
    if (pic_type == "png")
    {
        layout.Export(PNG);
    }
    // 导出PDF
    if (pic_type == "pdf")
    {
        layout.Export(PDF);
    }
}

其中控制图层显示的方法如下:

// 图层(组)显示控制【选定显示,其它关闭】
public static void ControlLayer(string lyName)
{
    // 获取当前地图
    Map map = MapView.Active.Map;
    // 获取所有要素图层
    var lys = map.GetLayersAsFlattenedList().ToList();
    // 获取输入的指定图层
    var initLayer = map.GetLayersAsFlattenedList().FirstOrDefault(item => item.Name.Equals(lyName));

    foreach (var ly in lys)
    {
        // 如果是指定的图层,或指定图层的子图层,就显示
        if (ly.Name == lyName || ly.Parent == initLayer)
        {
            ly.SetVisibility(true);
        }
        else
        {
            ly.SetVisibility(false);
        }
    }
}

打印完成后,最后一步就是还原图层的显示信息,打印前是怎么显示的还怎么显示。

// 设置当前所有图层显示信息
public static void SetLayerVisible(Dictionary<string, bool> dic)
{
    // 获取当前地图
    Map map = MapView.Active.Map;
    // 获取所有要素图层
    var lys = map.GetLayersAsFlattenedList().ToList();
    foreach (var ly in lys)
    {
        if (ly.Parent is Map)
        {
            ly.SetVisibility(dic[ly.Name]);
        }
        else
        {
            string paName = $"{ly.Parent}+++{ly.Name}";
            ly.SetVisibility(dic[paName]);
        }
    }
}

三、工具文件分享

我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:

【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

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

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

相关文章

SaaS BI数据可视化工具:免下载安装,登录即分析

之前有人问我&#xff0c;说&#xff1a;“BI数据可视化工具总是要下载安装&#xff0c;过程繁琐&#xff0c;没点IT基础的人也不太搞得定&#xff0c;有没有不用下载安装就能用的数据可视化工具&#xff1f;”答案当然是有的&#xff0c;那就是SaaS BI数据可视化工具。 SaaS …

Selenium 根据元素文本内容定位

使用xpath定位元素时&#xff0c;有时候担心元素位置会变&#xff0c;可以考虑使用文本内容来定位的方式。 例如图中的【股市】按钮&#xff0c;只有按钮文本没变&#xff0c;即使位置变化也可以定位到该元素。 xpath内容样例&#xff1a; # 文本内容完全匹配 //button[text(…

@RequestHeader使用

RequestHeader 请求头参数的设置 GetMapping("paramTest/requestHeader")public String requestHeaderTest(RequestHeader("name") String name){return name;} 在Postman的Headers中添加请求头参数&#xff0c;不过貌似不能加中文

面对算力瓶颈,如何利用CPU解决全链路智能编码?

编者按&#xff1a;英特尔是半导体行业和计算创新领域的全球领先厂商。与合作伙伴一起&#xff0c;英特尔推动了人工智能、5G、智能边缘等转折性技术的创新和应用突破&#xff0c;驱动智能互联世界。不久前&#xff0c;英特尔正式发布了第四代英特尔至强可扩展处理器&#xff0…

css实现文字首行缩进的效果

<div class"content"><p>站在徐汇滨江西岸智塔45楼&#xff0c;波光粼粼的黄浦江一览无余。近处&#xff0c;是由龙华机场储油罐改造而来的油罐艺术中心和阿里巴巴上海总部办公处。远处&#xff0c;历史悠久的龙华塔挺拔秀丽&#xff0c;总投资逾600亿元…

nginx负载均衡与反向代理与正向代理

负载均衡&#xff1a;通过反向代理来实现 正向代理的配置方法。 正向代理&#xff1a; 工作原理&#xff1a;用户端直接访问不了&#xff0c;需要通过代理服务器来访问web服务器&#xff0c;用户端先访问代理服务器&#xff0c;再访问web服务器。web服务器响应给代理服务器&a…

面试热题(反转链表)

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 链表的题&#xff0c;大部分都可以用指针或者递归可以做&#xff0c;指针如果做不出来的话&#xff0c;…

【产品经理】高阶产品如何提出有效解决方案?(1方法论+2案例+1清单)

每一件事情总有它的解决方案&#xff0c;在工作中亦是如此&#xff0c;而有效的解决方案&#xff0c;一定是具有系统性的。 有效的解决方案&#xff0c;一定是系统性的解决方案。 什么是系统性解决方案&#xff1f; 从系统结构&#xff08;或连接关系&#xff09;入手&#x…

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

在Qt中使用LoadLibrary无法加载DLL

Qt系列文章目录 文章目录 Qt系列文章目录前言一、问题分析 前言 最近因项目需要使用qt做开发&#xff0c;之前使用LoadLibrary加载dll成功&#xff0c;很庆幸&#xff0c;当一切都那么顺风顺水的时候&#xff0c;测试同事却发现&#xff0c;在windows平台上个别电脑上加载dll会…

在windows中使用parLapply函数执行并行计算

目录 1-lapply()函数介绍&#xff1a; 例子1&#xff1a; 例子2&#xff1a; 例子3&#xff1a; 2-在Windows使用并行计算&#xff0c;使用parLapply()函数 2.1-并行计算的准备阶段&#xff1a; 2.2-parLapply()函数介绍 2.3-使用parLapply()函数编写执行并行计算 2.4-…

ECRS工时分析:什么叫标准化作业管理?为什么要进行作业标准化管理

中国自古就有标准化。《孙子兵法》中&#xff0c;孙子训练射箭&#xff0c;射箭的姿势是“标准化操作”&#xff1b;中国武术中的套路是“标准化”&#xff1b;在中国古诗中&#xff0c;字数甚至被“标准化”来打开中国历史&#xff0c;“标准化”作业的例子数不胜数。 而在工厂…

国内常用的可视化工具软件,请收藏

可视化不单单指数据可视化&#xff0c;还包含了信息可视化、2D可视化、3D可视化等&#xff0c;可视化工具为前端设计人员提供了一种更简单的方法来创建可视化的表示形式。它们通常通过拖拉拽组件的形式实现可视化效果。 根据不同的项目需求选择合适的可视化工具将节省大量时间…

JavaSpring加载properties文件

手动加载 #properties文件 jdbc.driver1 <?xml version"1.0" encoding"UTF-8"?> <!-- 开启context命名空间--> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

Linux系统调试课:Linux Kernel Printk

🚀返回专栏总目录 文章目录 0、printk 说明1、printk 日志等级设置2、屏蔽等级日志控制机制3、printk打印常用方式4、printk打印格式0、printk 说明 在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk()是整个Kern…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

MPAS-A原理及陆面模式的基本概念

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

上下拉电阻

(一)上拉电阻&#xff1a;1、当TTL电路驱动COMS电路时&#xff0c;如果TTL电路输出的高电平低于COMS电路的最低高电平&#xff08;一般为3.5V&#xff09;&#xff0c;这时就需要在TTL的输出端接上拉电阻&#xff0c;以提高输出高电平的值。2、OC门电路必须加上拉电阻&#xff…

ffmpeg工具实用命令

说明&#xff1a;ffmpeg是一款非常好用的媒体操作工具&#xff0c;包含了许多对于视频、音频的操作&#xff0c;有些视频播放器&#xff0c;实际上就是套了一个ffmpeg的壳子。本文介绍ffmpeg的使用以及一些较为实用的命令。 安装 ffmpeg是命令行操作的&#xff0c;不需要安装…

PlanetScale vs. Neon - MySQL 和 Postgres 间的第二仗

本文为「数据库全方位对比系列」第三篇&#xff0c;该系列的前两部作品为&#xff1a; 全方位对比 Postgres 和 MySQL全方位对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经取代 MySQL 成为最受欢迎和渴望的数据库了。 看起来 MySQL 和 …