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

这篇具有很好参考价值的文章主要介绍了【ArcGIS Pro二次开发】(60):按图层导出布局。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

【ArcGIS Pro二次开发】(60):按图层导出布局,ArcGIS,ArcGIS Pro SDK,arcgis pro sdk,arcgis pro,二次开发,图层,布局

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

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

于是就自己做一个。


一、要实现的功能

 【ArcGIS Pro二次开发】(60):按图层导出布局,ArcGIS,ArcGIS Pro SDK,arcgis pro sdk,arcgis pro,二次开发,图层,布局

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

【ArcGIS Pro二次开发】(60):按图层导出布局,ArcGIS,ArcGIS Pro SDK,arcgis pro sdk,arcgis pro,二次开发,图层,布局

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

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

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

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

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

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

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

生成结果如下:

【ArcGIS Pro二次开发】(60):按图层导出布局,ArcGIS,ArcGIS Pro SDK,arcgis pro sdk,arcgis pro,二次开发,图层,布局


二、实现流程

核心代码如下:

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

这里需要注意的是,有可能一个同名图层会放在不同的图层组中,如上面的【永久基本农田】就放在了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文件直接安装。文章来源地址https://www.toymoban.com/news/detail-650395.html

到了这里,关于【ArcGIS Pro二次开发】(60):按图层导出布局的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ArcGIS Pro二次开发】(57):地图系列

    在ArcGIS Pro中,有一个地图系列,可以在一个布局中导出多个地图。 在SDK中为ArcGIS.Desktop.layout.MapSeries类和映射系列导出选项,可以以支持多页导出。 MapSeries类提供了一个静态CreateSpatialMapSeries方法,该方法使用指定的索引层(作为参数传递)为给定布局生成空间地图系列。 使

    2024年02月14日
    浏览(33)
  • 【ArcGIS Pro二次开发】(64):多分式标注

    在ArcGIS中有时会遇到需要二分式标注的情况,有时甚至是三分式、四分式。 通过输入标注表达式,可以做出如下的效果,但是代码不短,每次都要输一遍也挺麻烦。 网上也有一些分式标注的python工具,但不够直观,于是做了这个一键式的工具。 如上图所示,在待处理的要素

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

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

    2024年02月13日
    浏览(27)
  • 【ArcGIS Pro二次开发】(63):批量更改字段别名

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月15日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包