【ArcGIS Pro二次开发】(50):布局(Layout)的基本操作

ArcGIS Pro SDK中的布局(Layout)是用于创建和编辑打印布局的一组功能。

Layout是打印布局的容器,它可以包含多个元素,例如地图框、文本框、图例、比例尺等。

Layout中包含多种元素,比较重要的有:地图(MapFrameElement)、文本(TextElement)、图片(PictureElement)、图例(LegendElement)等。


1、获取当前工程中的布局

// 获取当前工程中的所有LayoutProjectItem
IEnumerable<LayoutProjectItem> layouts = Project.Current.GetItems<LayoutProjectItem>();// 按名称获取LayoutProjectItem
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));

2、打开指定的布局

// 按名称获取LayoutProjectItem 
LayoutProjectItem someLytItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));// 获取layout 
Layout layout = await QueuedTask.Run(() => someLytItem.GetLayout());// 打开布局视图【注意要在UI线程中执行】
ILayoutPane iNewLayoutPane = await ProApp.Panes.CreateLayoutPaneAsync(layout);

3、激活一个已经打开的布局

foreach (var pane in ProApp.Panes)   // 搜索所有的面板
{var layoutPane = pane as ILayoutPane;if (layoutPane == null)  // 如果不是布局面板,则跳过continue;if (layoutPane.LayoutView.Layout == layout) //如果是,则激活{(layoutPane as Pane).Activate();return;}
}

4、获取当前激活的布局视图

// 判断当前活动视图是否为布局视图
LayoutView activeLayoutView = LayoutView.Active;
if (activeLayoutView != null)
{// TO DO
}

5、导入布局文件(.pagx)

IProjectItem pagx = ItemFactory.Instance.Create(@"C:\Temp\Layout.pagx") as IProjectItem;
Project.Current.AddItem(pagx);

6、移除布局(从工程中移除,慎重)

Project.Current.RemoveItem(layoutItem)

7、创建一个基础布局,并打开

// 在主线程中创建一个新布局
Layout lyt = await QueuedTask.Run(() =>
{var newLayout = LayoutFactory.Instance.CreateLayout(8.5, 11, LinearUnit.Inches);newLayout.SetName("新的布局");return newLayout;
});// 在UI线程中打开
await ProApp.Panes.CreateLayoutPaneAsync(lyt);

8、通过CIM创建布局

CIM(Cartographic Information Model)(地图信息模型)是ArcGIS Pro SDK中的一种数据模型,用于表示地图和图层的符号、样式和布局信息。CIM提供了一种统一的方式来描述地理信息系统(GIS)中的地图元素,包括点、线、面、文本、图例等。

CIM采用XML或JSON格式,以纯文本形式存储地图元素的属性和样式信息。它提供了一个可扩展的架构,允许开发人员创建自定义的符号和样式,并与ArcGIS Pro进行集成。CIM还可以在不同的GIS平台和应用程序之间进行数据交换,实现跨平台的一致性。

// 在主线程中创建一个 CIMLayout
Layout newCIMLayout = await QueuedTask.Run(() =>
{// 设置CIM页面CIMPage newPage = new CIMPage{// 参数设置Width = 8.5,Height = 11,Units = LinearUnit.Inches,// 标尺设置ShowRulers = true,SmallestRulerDivision = 0.5,// guides设置【参考线?】ShowGuides = true};CIMGuide guide1 = new CIMGuide{Position = 1,Orientation = Orientation.Vertical};CIMGuide guide2 = new CIMGuide{Position = 6.5,Orientation = Orientation.Vertical};CIMGuide guide3 = new CIMGuide{Position = 1,Orientation = Orientation.Horizontal};CIMGuide guide4 = new CIMGuide{Position = 10,Orientation = Orientation.Horizontal};List<CIMGuide> guideList = new List<CIMGuide>{guide1,guide2,guide3,guide4};newPage.Guides = guideList.ToArray();// 使用上面设置的自定义CIM构建新布局var layout_local = LayoutFactory.Instance.CreateLayout(newPage);layout_local.SetName("新的CIM布局");return layout_local;
});// 在UI线程中打开CIM布局
await ProApp.Panes.CreateLayoutPaneAsync(newCIMLayout);

9、修改布局尺寸

// 获取LayoutProjectItem 
LayoutProjectItem lytItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));
if (layoutItem != null)
{await QueuedTask.Run(() =>{// 获取LayoutLayout lyt = lytItem.GetLayout();if (lyt != null){// 获取CIMPage,更改设置CIMPage page = lyt.GetPage();page.Width = 8.5;page.Height = 11;// 应用修改后的CIMPagelyt.SetPage(page);}});
}

10、在布局中搜索元素

// 获取LayoutProjectItem
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));
if (layoutItem != null)
{QueuedTask.Run(() =>{// 获取LayoutLayout mylayout = layoutItem.GetLayout();if (mylayout != null){// 获取Element,方法一Element rect = mylayout.FindElement("Rectangle") as Element;// 获取Element,方法二Element rect2 = mylayout.Elements.FirstOrDefault(item => item.Name.Equals("Rectangle"));}});
}

更多的搜索方法如下,按名称搜索:

// 直接按名称搜索
var layoutElementsToFind = layout.FindElements(new List<string>() { "Point 1", "Line 3", "Text 1" });
// 获取元素集合,保留元素之间的嵌套关系
var elementCollection = layout.GetElements();
// 获取元素集合,并展开成列表【这个应该会常用一些】
var elements = layout.GetElementsAsFlattenedList();
// 将元素集合转换为GraphicElement集合
var graphicElements = elements.ToList().ConvertAll(x => (GraphicElement)x);

按类型搜索:

// 点
var pointGraphics = graphicElements.Where(elem => elem.GetGraphic() is CIMPointGraphic);
// 线
var lineGraphics = graphicElements.Where(elem => elem.GetGraphic() is CIMLineGraphic);
// 面
var polyGraphics = graphicElements.Where(elem => elem.GetGraphic() is CIMPolygonGraphic);
// 文本
var textGraphics = graphicElements.Where(elem => elem.GetGraphic() is CIMTextGraphic);
// 图片
var pictureGraphic = graphicElements.Where(elem => elem.GetGraphic() is CIMPictureGraphic);

11、元素属性设置

QueuedTask.Run(() =>
{// 名称element.SetName("New Name");// 可见性element.SetVisible(true);
});

12、获取所选元素的个数

// 获取当前布局
LayoutView activeLayoutView = LayoutView.Active;
if (activeLayoutView != null)
{// 获取当前选择的元素var selectedElements = activeLayoutView.GetSelectedElements();// 元素数量var count = selectedElements.Count;
}

13、选择要素

// 获取当前布局视图
LayoutView activeLayoutView = LayoutView.Active;
if (activeLayoutView != null)
{QueuedTask.Run(() =>{// 获取LayoutLayout lyt = activeLayoutView.Layout;// 获取2个要素Element rec = lyt.FindElement("Rectangle");Element rec2 = lyt.FindElement("Rectangle 2");// 设为集合,为了同时选择多个元素List<Element> elmList = new List<Element>{rec,rec2};// 将元素集合设置为当前选择activeLayoutView.SelectElements(elmList);});
}

14、取消选择要素

/// 在Layout中取消///
// 取消选择单个元素
var elementToUnSelect = layout.FindElements(new List<string>() { "MyPoint" }).FirstOrDefault();
layout.UnSelectElement(elementToUnSelect);
// 取消选择多个元素
var elementsToUnSelect = layout.FindElements(new List<string>() { "Point 1", "Line 3", "Text 1" });
layout.UnSelectElements(elementsToUnSelect);/// 也可以在LayoutView中取消///
LayoutView layoutView = LayoutView.Active;
// 取消选择单个元素
var elementToUnSelectInView = layout.FindElements(new List<string>() { "MyPoint" }).FirstOrDefault();
layoutView.UnSelectElement(elementToUnSelect);
// 取消选择多个元素
var elementsToUnSelectInView = layout.FindElements(new List<string>() { "Point 1", "Line 3", "Text 1" });
layoutView.UnSelectElements(elementsToUnSelect);/// 全部元素取消选择///
// LayoutView取消选择
activeLayoutView.ClearElementSelection();
// Layout取消选择
layout.ClearElementSelection();

15、复制、删除元素

// 获取元素
var elems = layout.FindElements(new List<string>() { "Point 1", "Line 3", "Text 1" });// 复制元素
var copiedElements = layout.CopyElements(elems);// 删除单个个元素
layout.DeleteElement(elem);// 删除多个元素
layout.DeleteElements(elems);// 删除所有元素
Layout.DeleteElements(item => true);

16、移动显示范围至要素

LayoutView lytView = LayoutView.Active;
// 移动显示到单个元素
var elementToZoomTo = layout.FindElements(new List<string>() { "MyPoint" }).FirstOrDefault();
lytView.ZoomToElement(elementToZoomTo);
// 移动显示到多个个元素
var elementsToZoomTo = layout.FindElements(new List<string>() { "Point 1", "Line 3", "Text 1" });
lytView.ZoomToElements(elementsToZoomTo);

17、元素成组

var elemsToGroup = layout.GetSelectedElements();// 成组
var groupElement = layout.GroupElements(elemsToGroup);// 取消多个组
layout.UnGroupElements(elementsToUnGroup);// 取消单个组
layout.UnGroupElement(elementsToUnGroup.FirstOrDefault());// 获取元素所在的组
var parent = groupElement.Elements.First().GetParent();// 获取最高层级的级【可能会是图形图层GraphicsLayer或Layout】
var top_most = groupElement.Elements.First().GetParent(true);// 获取组里的元素成员【不会保留嵌套关系】
var children = groupElement.GetElementsAsFlattenedList();

18、元素的前置和后置

var sel_elems = layout.GetSelectedElements();
// 判断是否可以前置
if (layout.CanBringForward(sel_elems))
{layout.BringForward(sel_elems);// 放到父元素之前graphicsLayer.BringToFront(sel_elems);
}
else if (layout.CanSendBackward(sel_elems))
{// 判断是否可以后置layout.SendBackward(sel_elems);// 放到父元素之后graphicsLayer.SendToBack(sel_elems);
}

19、更改文本元素的属性

LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));
if (layoutItem != null)
{QueuedTask.Run(() =>{Layout layout = layoutItem.GetLayout();if (layout != null){// 获取TextElementTextElement txtElm = layout.FindElement("MyTextElement") as TextElement;if (txtElm != null){// 更改放置属性txtElm.SetAnchor(Anchor.CenterPoint);txtElm.SetX(x);txtElm.SetY(y);// 更改文本属性TextProperties txtProperties = new TextProperties("Hello world", "Times New Roman", 48, "Regular");txtElm.SetTextProperties(txtProperties);}}});
}

20、更改图片元素的属性【路径】

PictureElement picElm = layout.FindElement("MyPicture") as PictureElement;// 更改路径
if (picElm != null)
{picElm.SetSourcePath(@"D:\MyData\Pics\somePic.jpg");
}

21、更改图形元素的透明度

// 要在元素的CIMGraphic类中设置
CIMGraphic CIMGraphic = graphicElement.GetGraphic() as CIMGraphic;
// 设置透明度50%
CIMGraphic.Transparency = 50;
// 应用设置
graphicElement.SetGraphic(CIMGraphic);

22、更改地图框中的地图

// 获取地图框
MapFrame mfrm = layout.FindElement("Map Frame") as MapFrame;await QueuedTask.Run(() =>
{// 获取工程中的地图Map map = Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name.Equals("Map1")).GetMap();// 地图框的地图设置为上一步获取的地图mfrm.SetMap(map);
});

23、地图框中的视图缩放至所选要素类

await QueuedTask.Run(() =>
{// 获取地图框MapFrame mf = layout.FindElement("Map Frame") as MapFrame;// 获取地图、要素Map m = mf.Map;FeatureLayer lyr = m.FindLayers("GreatLakes").First() as FeatureLayer;// 缩放至要素【也可以是多个要素(List<FeatureLayer>)】mf.SetCamera(lyr, false);
});

24、地图框中的视图缩放至所选单个要素,并且定量缩放视图

await QueuedTask.Run(() =>
{MapFrame mf = layout.FindElement("Map Frame") as MapFrame;Map m = mf.Map;FeatureLayer fl = m.FindLayers("GreatLakes").First() as FeatureLayer;QueryFilter qf = new QueryFilter();string whereClause = "NAME = 'Lake Erie'";qf.WhereClause = whereClause;using (ArcGIS.Core.Data.RowCursor rowCursor = fl.Search(qf)){while (rowCursor.MoveNext()){// 获取单个要素using (var feature = rowCursor.Current as ArcGIS.Core.Data.Feature){Polygon polygon = feature.GetShape() as Polygon;Envelope env = polygon.Extent as Envelope;mf.SetCamera(env);// 可以调节缩放Camera cam = mf.Camera;cam.Scale = cam.Scale * 1.15;mf.SetCamera(cam);}}}
});

25、激活、失活地图框

var lv = LayoutView.Active;
// 激活
lv.ActivateMapFrame(map_frame);
// 失活
lv.DeactivateMapFrame();
// 获取当前激活的地图视图
var map_view = lv.ActivatedMapView;
// 获取当前激活的地图框
var map_frame = lv.ActivatedMapFrame;

26、视图导出至PDF

同样的,可以导出jpg,png,bmp等图片。

// PDF属性设置
PDFFormat PDF = new PDFFormat()
{OutputFileName = filePath,      // 输出路径Resolution = 300,               // 分辨率DoCompressVectorGraphics = true,   // 是否压缩矢量图形DoEmbedFonts = true,            // 是否执行嵌入字体         HasGeoRefInfo = true,             // 是否具有地理参考信息ImageCompression = ImageCompression.Adaptive,   // 图形压缩.自适应ImageQuality = ImageQuality.Best,           // 图形质量.最好LayersAndAttributes = LayersAndAttributes.LayersAndAttributes   // 图层  属性
};// 如果路径有效,则导出
if (PDF.ValidateOutputFilePath())
{await QueuedTask.Run(() => layout.Export(PDF));
}

27、地图框导出至JPG图片

同样的,可以导出其它类型的图片。

JPEGFormat JPG = new JPEGFormat()
{HasWorldFile = true,Resolution = 300,OutputFileName = filePath,ColorMode = JPEGColorMode.TwentyFourBitTrueColor,Height = 800,Width = 1200
};MapFrame mf = layout.FindElement("MyMapFrame") as MapFrame;await QueuedTask.Run(() =>
{// 检查路径是否有效if (JPG.ValidateOutputFilePath()){mf.Export(JPG);}
});

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

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

相关文章

Android Hook技术实战详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 什么是Android Hook技术&#xff1f; Android Hook技术是指在Android…

1.6 运维分类与工作内容

文章目录 运维分类与工作内容1. 系统运维2. 网络运维3. 数据库运维4. 应用运维5. 安全运维结论 运维分类与工作内容 运维&#xff08;Operations and Maintenance&#xff0c;简称O&M&#xff09;是信息技术领域中负责管理和维护企业的信息技术基础设施的重要职能。随着技…

Python爬虫学习笔记(八)————Phantomjs与Chrome handless

目录 1.Phantomjs &#xff08;1&#xff09;什么是Phantomjs&#xff1f; &#xff08;2&#xff09;如何使用Phantomjs&#xff1f; 2 .Chrome handless &#xff08;1&#xff09;系统要求&#xff1a; &#xff08;2&#xff09;配置&#xff1a; &#xff08;3&…

API例子:用Python驱动采集网页数据

1 引言 本文讲解怎样用Python驱动浏览器写一个简易的网页数据采集器。开源Python即时网络爬虫项目将与Scrapy&#xff08;基于twisted的异步网络框架&#xff09;集成&#xff0c;所以本例将使用Scrapy采集淘宝这种含有大量ajax代码的网页数据&#xff0c;但是要注意本例一个严…

matlab重名函数调用踩坑记录

我新安装了matlab的robotics toolbox&#xff0c;然而调用的rotx不是我想要的函数。 我上网查了一下资料&#xff0c;知乎和csdn有相关的回答&#xff0c;但是我试了一下还是不行。它们的方法是移除路径再添加路径避免函数的冲突。相关方法放在文末的相关参考1 2。这里建议先用…

VScode跑gtest

可能得前置步骤 VScode安装cpp: 安装 C/C 扩展&#xff1a;打开 VSCode 扩展市场&#xff0c;搜索「C/C」并安装扩展。 安装编译gtest 安装 Google Test&#xff1a; 如果你使用的是 Windows&#xff0c;可以下载并安装 pre-built 版本&#xff1b;如果你使用的是 Linux 或…

ETHERNET/IP转TCP/IP网关tcp/ip协议包含哪几层

大家好&#xff0c;今天我们将带大家了解一款自主研发的通讯网关&#xff0c;远创智控YC-EIP-TCP/IP。这是一个强大的工具&#xff0c;能帮助我们将ETHERNET/IP网络和TCP/IP网络连接在一起&#xff0c;让我们更好地管理和监控网络。 1, 首先&#xff0c;让我们来看看这款网关…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定&#xff0c;需要制作棋盘格&#xff0c;无奈其电脑有些卡&#xff0c;对此毫无经验的博主从头开始安装&#xff08;此前博主已经安装了ROS环境&#x…

leetcode 965.单值二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;单值二叉树 思路&#xff1a; 让当前的根节点与左孩子节点与右孩子节点判断&#xff0c;若相等则继续向下分治&#xff0c;让左孩子与右孩子当作新的根节点继续判断&#xff0c;直到某个节点不相等。 1️⃣ 代码&#x…

用thinkphp6写一个博客系统,输出完整项目代码

很抱歉&#xff0c;我无法提供完整项目代码。但是&#xff0c;我可以为您提供一个简单的示例&#xff0c;以帮助您开始使用 ThinkPHP 6 构建博客系统。 环境准备&#xff1a;安装 PHP 和 Composer安装并配置一个适当的 Web 服务器&#xff08;如 Apache 或 Nginx&#xff09;创…

Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

Spring Cloud Gateway官网:Spring Cloud Gateway 局域网中就有网关这个概念&#xff0c;局域网接收数据或发送数据都要通过网关&#xff0c;比如使用VMware虚拟机软件搭建虚拟机集群的时候&#xff0c;往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升…

【Linux系统】结合有趣的小故事让你学懂生产者消费者模型

目录 由故事引入模型故事背景供货商们的矛盾市民们和供货商之间的矛盾一市民们和供货商之间的矛盾二市民们的矛盾模型总结 生产者消费者模型为什么要使用生产者消费者模型&#xff1f;生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型C queue模…

力扣 452. 用最少数量的箭引爆气球

题目来源&#xff1a;https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ C题解1&#xff1a; 根据x_end排序&#xff0c;x_start小的在前&#xff0c;这样可以保证如果第 i 个球的x_end大于等于第 j 个球的x_start时&#xff0c;第 j 个球…

ElasticSearch文档(document)在index上的增删改查

文章目录 一、document定义&#xff1a;二、单条增删改查1、创建索引&#xff1a;2、添加文档&#xff1a;3、获取文档&#xff1a;4、更新文档&#xff1a;5、删除文档&#xff1a; 三、批量增删改查&#xff1a;1、批量添加文档&#xff1a;2、批量更新文档&#xff1a;3、批…

自建DNSlog服务器

DNSlog简介 在某些情况下&#xff0c;无法利用漏洞获得回显。但是&#xff0c;如果目标可以发送DNS请求&#xff0c;则可以通过DNS log方式将想获得的数据外带出来。 DNS log常用于以下情况&#xff1a; SQL盲注无回显的命令执行无回显的SSRF 网上公开提供dnslog服务有很多…

FactoryBean源码解析

文章目录 一、简介二、FactoryBean 接口的方法三、FactoryBean 与 BeanFactory 的区别四、源码解析五、实际应用 一、简介 FactoryBean 是 Spring 框架中的一个接口&#xff0c;用来创建特定类型的 Bean 对象。实现FactoryBean 接口就可以自定义 Bean 对象的创建过程。Factory…

利用ArcGIS Pro制作三维效果图

1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 2、添加数据 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏…

开放式蓝牙耳机推荐哪款?开放式蓝牙耳机排行榜推荐

​说到开放式耳机&#xff0c;想必很多人听着还是陌生&#xff0c;普通耳机久戴&#xff0c;会出现耳朵疼痛问题&#xff0c;而开放式蓝牙耳机没有&#xff0c;不入耳的设计更加的干净&#xff0c;不会对耳道造成的伤害&#xff0c;下面我给大家推荐几款很不错的开放式耳机&…

Jenkins的安装部署以及基本使用

前言&#xff1a; 今天有空大概记录的一个作为一个测试人员日常中Jenkins的使用。 一、环境准备 在安装使用Jenkins前我们要先安装jdk&#xff0c;这里博主选择的是jdk11。我们先删除旧的jdk然后安装全新的jdk。 1、先看下当前我们的jdk版本。 2、查看jdk安装路径&#xff1…

【Rust 基础篇】Rust 解引用多态

导言 在 Rust 中&#xff0c;解引用多态&#xff08;Deref Coercion&#xff09;是一种特性&#xff0c;它允许自动进行类型转换&#xff0c;将实现了 Deref trait 的类型转换为目标类型的引用。通过解引用多态&#xff0c;我们可以更方便地使用不同类型的智能指针和引用。 本…