【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 // 图层 属性};// 导出JPGif (pic_type == "jpg"){layout.Export(JPG);}// 导出PNGif (pic_type == "png"){layout.Export(PNG);}// 导出PDFif (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文件直接安装。
相关文章:

【ArcGIS Pro二次开发】(60):按图层导出布局
在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3…...
docker-desktop数据目录迁移
1.退出docker-desktop后执行 wsl --list -v 如下 NAME STATE VERSION * docker-desktop Stopped 2docker-desktop-data Stopped 22.执行以下命令进行数据导出:(需要等待命令执行完成)…...

03.利用Redis实现缓存功能---解决缓存穿透版
学习目标: 提示:学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出: 缓存穿透讲解图: 解决方案: 采用缓存空对象采用布隆过滤器 解决方案流程图: 1. 准备pom环境 <dependency><gro…...

全景图!最近20年,自然语言处理领域的发展
夕小瑶科技说 原创 作者 | 小戏、Python 最近这几年,大家一起共同经历了 NLP(写一下全称,Natural Language Processing) 这一领域井喷式的发展,从 Word2Vec 到大量使用 RNN、LSTM,从 seq2seq 再到 Attenti…...
Mybatis参数传递
Map传参, #{}里的key要一一对应不能乱写,如果不存在则会填充NULL,不会报错 Map<String, Object> map new HashMap<>(); // 让key的可读性增强 map.put("carNum", "103"); map.put("brand", "奔驰E300L&…...

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】
😀前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的…...

部署模型并与 TVM 集成
本篇文章译自英文文档 Deploy Models and Integrate TVM tvm 0.14.dev0 documentation 更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站 本节介绍如何将 TVM 部署到各种平台&…...
Android Navigation 导航切换fragment用法
对于Android Navigation组件的导航到Fragment,您可以按照以下步骤操作: 首先,在您的项目的build.gradle文件中添加Navigation依赖: dependencies {def nav_version "2.3.4"implementation "androidx.navigation…...

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退
艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安…...

【jvm】jvm整体结构(hotspot)
目录 一、说明二、java代码的执行流程三、jvm的架构模型3.1 基于栈式架构的特点3.2 基于寄存器架构的特点 一、说明 1.hotspot vm是目前市场上高性能虚拟机的代表作之一 2.hotspot采用解释器与即时编译器并存的架构 3.java虚拟机是用来解释运行字节码文件的,入口是字…...

通达信波段选股公式,使用钱德动量摆动指标(CMO)
钱德动量摆动指标(CMO)是由图莎尔钱德发明的,取值范围在-100到100之间,是捕捉价格动量的技术指标。该指标计算近期涨幅之和与近期跌幅之和的差值,然后将计算结果除以同期所有价格波动的总和。本文的波段选股公式使用均线识别趋势,…...

家电维修小程序开发指南:从零搭建到上线
随着科技的发展和人们生活水平的提高,家电已经成为人们生活中不可或缺的一部分。然而,随之而来的是家电维修门店业务的繁忙和效率的考验。为了提高家电维修门店的效率和服务质量,建立一个便捷高效的小程序已成为必要的选择。 本文将介绍一个简…...

玩赚音视频开发高阶技术——FFmpeg
随着移动互联网的普及,人们对音视频内容的需求也不断增加。无论是社交媒体平台、电商平台还是在线教育,都离不开音视频的应用。这就为音视频开发人员提供了广阔的就业机会。根据这些年来网站上的音视频开发招聘需求来看,音视频开发人员的需求…...

python 变量赋值 修改之后 原值改变
python 是一种动态语言,因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时,实际上是将变量的引用地址传递给新的变量,这意 味着新旧变量将指向同一个位置。因此,在更改其中一个变量的值时,另一…...

拂袖一挥,zipfile秒列zip包内容
使用wxpython列出文件夹中的zip文件及内容 最近在做一个文件管理的小工具,需要列出选择的文件夹下的所有zip压缩文件,并在点击某个zip文件时能够显示其中的内容。为此我使用了wxpython来实现这个功能。 1. 导入需要的模块 首先导入程序需要的模块: import wx import os imp…...
InnoDB文件物理结构解析2 - FIL_PAGE_INDEX
1. 关于索引组织表 InnoDB使用的是索引组织表(IOT)的方式存储表记录,索引组织表以主键构建一个B-tree的数据结构来存储行记录,行记录存储在树的叶节点内。这与Oracle数据库是不同的,Oracle数据库默认创建的表是堆组织表(HOT),HOT…...
XML-BEANS compiled schema: Could not locate compiled schema resource 异常处理
使用poi5.2.2生成ppt,生成堆叠图,设置值时抛出异常 XML-BEANS compiled schema: Could not locate compiled schema resource org/apache/poi/schemas/ooxml/system/ooxml/stoverlappercent872etype.xsb (org.apache.poi.schemas.ooxml.system.ooxml.st…...

IOC容器 - Autofac
DI(依赖注入):DI(Dependency Injection)是一种实现松耦合和可测试性的软件设计模式。它的核心思想是将依赖关系的创建与管理交给外部容器,使得对象之间只依赖于接口而不直接依赖于具体实现类。通过依赖注入…...

用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码
一、i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度,如果是vue2点几,记得安装i18n的8版本,不然会自动安装的最新版本,后面会报错哦,查询了下资料,好像最新版本是适配的vue3。 npm install vue-…...

Vue3 :Pinia入门
Vue3 :Pinia入门 Date: May 11, 2023 Sum: Pinia概念、实现counter、getters、异步action、storeToRefs保持响应式解构 什么是Pinia Pinia 是 Vue 的专属状态管理库,可以实现跨组件或页面共享状态,是 vuex 状态管理工具的替代品,…...
【element-ui】el-autocomplete实现 无数据匹配
文章目录 方法一:使用 default 插槽方法二:使用 empty-text 属性(适用于列表类型)总结 在使用 Element UI 的 el-autocomplete 组件时,如果你希望在没有任何数据匹配的情况下显示特定的内容,你可以通过自定…...
C++动态规划-线性DP
这是一套C线性DP题目的答案。如果需要题目,请私信我,我将会更新题干 P1:单子序列最大和 #include <bits/stdc.h> using namespace std; int n,A,B,C; int a[200005]; int s[200005]; int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…...

GPUCUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)
目录 文章目录 目录1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路 学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现:OpenGL 3D 渲染管线设计 1. 顶点处理&…...

LabVIEW主轴故障诊断案例
LabVIEW 开发主轴机械状态识别与故障诊断系统,适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法,实现从信号采集到故障定位的全流程自动化,为设备维护提供数据支撑,提升数控机床运行可靠性。 面向精密制造企业数控机…...
Scade 语言概念 - 方程(equation)
在 Scade 6 程序中自定义算子(Operator)的定义、或数据流定义(data_def)的内容中,包含一种基本的语言结构:方程(equation)(注1)。在本篇中,将叙述 Scade 语言方程的文法形式,以及作用。 注1: 对 Scade 中的 equation, 或 equation…...

【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试
文章主要内容如下: 1、基础运行环境配置 2、Torch-GPU安装 3、ultralytics环境配置 4、Onnx及TensorRT导出详解 5、YOLOv8推理耗时分析 基础库版本:jetpack5.1.3, torch-gpu2.1.0, torchvision0.16.0, ultralytics8.3.146 设备的软件开发包基础信息 需…...

基于springboot的藏文古籍系统
博主介绍:高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在…...
【Linux内核】设备模型之udev技术详解
目录 1. udev技术概述 2. 技术层次分析 2.1 内核层交互 2.2 规则引擎层 2.3 用户空间实现 3. 关键技术要点 3.1 动态设备节点管理 3.2 热插拔处理 3.3 模块化规则系统 3.3.1. 变量替换功能 3.3.2. 条件判断能力 3.3.3. 实现机制 3.3.4 应用场景 3.3.5 扩展能力 4…...
C#封装HttpClient:HTTP请求处理最佳实践
C#封装HttpClient:HTTP请求处理最佳实践 在现代的.NET应用程序开发中,与外部服务进行HTTP通信是一项常见需求。HttpClient作为.NET框架中处理HTTP请求的核心组件,为我们提供了强大而灵活的API。然而,直接使用原生的HttpClient可能…...
Flink 高可用集群部署指南
一、部署架构设计 1. 集群架构 graph TDClient([客户端]) --> JM1[JobManager 1]Client --> JM2[JobManager 2]Client --> JM3[JobManager 3]subgraph ZooKeeper集群ZK1[ZooKeeper 1]ZK2[ZooKeeper 2]ZK3[ZooKeeper 3]endsubgraph TaskManager集群TM1[TaskManager 1…...