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

这篇具有很好参考价值的文章主要介绍了【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(() =>
  {
    // 获取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等图片。

// 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ArcGIS Pro二次开发】(63):批量更改字段别名

    在我工作中遇到的大多数图斑,字段名称一般是英文,字段别名是中文,使用起来是比较方便的。 但有时候也会遇到一些不一样的情况,不知是经过了怎样的处理,图斑的字段别名被修改成了和字段名称一样的英文,这样就很理解字段名称的意思,特别是其它专业、不熟悉的

    2024年02月11日
    浏览(80)
  • 【ArcGIS Pro二次开发】(80):标注_CIMLabelClass

    CIMLabelClass(Cartographic Information Model Label Class)是ArcGIS Pro SDK中的一个类。 它主要用于定义标签的样式和属性,如字体、大小、颜色、对齐方式等,以及标签的排列和布局规则。 1、获取当前地图的标签引擎 2、修改当前地图的标签引擎 3、将文字符号TextSymbol应用到要素图层

    2024年02月19日
    浏览(50)
  • 【ArcGIS Pro二次开发】(59):Editing(编辑)模块

    ArcGIS Pro SDK中的\\\"Editing\\\"(编辑)模块提供了一系列API和工具,允许开发人员在ArcGIS Pro中实现各种地图数据编辑操作,从简单的要素绘制到复杂的数据集编辑。 下面列举一些常用编辑工具的实现方法。 1、获取所选要素的属性及赋值 2、通过【inspector】获取字段属性 3、裁剪面

    2024年02月13日
    浏览(39)
  • 【ArcGIS Pro二次开发】(56):界址点导出Excel

    界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。 在弹出的工具框中,分别输入参数: 1、

    2024年02月14日
    浏览(38)
  • 【ArcGIS Pro二次开发】(81):文本符号_CIMTextSymbol

    CIMTextSymbol是用于绘制文本图形注释的文本符号。 0、属性 Angel 文本符号的放置角度 BlockProgression 多行文本的堆叠方向 Callout 引线 DrawSoftHyphen 连字符 FlipAngle 文本翻转(镜像)到位的角度 FontEffects 上下标 FontEncoding 获取文字的Encoding FontFamilyName 字体名称 FontStyleName 字形样式,例

    2024年02月20日
    浏览(48)
  • 【ArcGIS Pro二次开发】(36):度分秒转十进制度

    经纬度坐标的表达方式比较常用的一般有2种,【度分秒和十进制度】。 在成果展示中,以【度分秒】居多,但如果要将坐标导入ArcGIS中,则一般需要用到【十进制度】,这个转换可以在Excel中进行,也可以在ArcGIS中的字段计算里计算,但都有点小麻烦。 为了更方便的转换,

    2024年02月09日
    浏览(52)
  • 【ArcGIS Pro二次开发】(58):数据的本地化存储

    在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望能够保存下来,而不是每次都去修改默认值。 于是,想到可以将这

    2024年02月14日
    浏览(44)
  • 【ArcGIS Pro二次开发】(53):村规制表、制图【福建省】

    这篇算是村规入库的一个延续。 村庄规划中有一些图纸是需要严格按照规范制图,或形成一定规范格式的。 这些图纸的制作基本算是机械式的工作,可以用工具来代替人工。 如上图所示,在【村庄规划】组,新增了两个工作面板:【制表】和【制图】。 【制表】面板共有

    2024年02月15日
    浏览(41)
  • 【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

    本工具主要是针对国空数据入库而做的。 如果你手头已经整理了一部分要素类数据,但是数据格式,字段值可能并没有完全按照规范设置好,需要将这些数据按规范批量和库,就可以尝试用这个工具。 准备数据:标准空库、你已做好的数据。 做好的数据需要把要素名改成和

    2024年02月16日
    浏览(47)
  • 【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

    之前用Arcpy脚本工具做了一个村规数据入库和主要图纸生成工具。 在使用过程中,感觉对电脑环境比较高,换电脑用经常会一些莫名其妙的错误,bug修得很累。近来随着ArcGIS Pro SDK的熟悉,就有了移植的想法。 这里先把村规数据入库工具做出来,后续还将继续做主要图纸生成

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包