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(() =>
{
// 获取Layout
Layout lyt = lytItem.GetLayout();
if (lyt != null)
{
// 获取CIMPage,更改设置
CIMPage page = lyt.GetPage();
page.Width = 8.5;
page.Height = 11;
// 应用修改后的CIMPage
lyt.SetPage(page);
}
});
}
10、在布局中搜索元素
// 获取LayoutProjectItem
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("MyLayout"));
if (layoutItem != null)
{
QueuedTask.Run(() =>
{
// 获取Layout
Layout 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(() =>
{
// 获取Layout
Layout 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)
{
// 获取TextElement
TextElement 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等图片。文章来源:https://www.toymoban.com/news/detail-597637.html
// 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图片
同样的,可以导出其它类型的图片。文章来源地址https://www.toymoban.com/news/detail-597637.html
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);
}
});
到了这里,关于【ArcGIS Pro二次开发】(50):布局(Layout)的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!