【ArcGIS Pro二次开发实例教程】(1):图层的前置、后置

一、简介

此工具要实现的功能是:将内容框中当前选定的图层移到最顶层或最底层。

主要技术要点包括:

1、Config.daml文件设置(UI设置)

2、按钮的图片和位置设置

3、当前选定图层的获取

4、图层在内容列表中位置的获取和移动


二、前端

1、UI界面的初步搭建

创建一个ArcGIS Pro模块加载项,注意是C#,不是下面那个VB的类型。

在项目中,右键点击【项目】,添加1个【新建项】:

添加2个【ArcGIS Pro按钮】,分别命名为【btn_front.cs】和【btn_back.cs】。

打开【Config.daml】,对UI界面做一个设置。

<tabs>是标签栏,里面的内容默认是被注释掉的。将其选择后,按【Ctrl+K+U】将注释取消。

(快速注释的快捷键是【Ctrl+K+C】)

然后将caption(即标签栏的文字)改一个值,如【二次开发实例】。

<groups>是标签栏下的分组栏,刚才创建的2个Button默认就放在第1个group里。

将这个group的caption改为【初级教程】。

appearsOnAddInTab属性为是否将group放在系统默认的1个标签栏里,一般就改为【false】。

初步设置完毕,点击【调试】,VS会自动打开ArcGIS Pro。

在打开的ArcGIS Pro工程里查看,会发现1个【二次开发实例】标签栏,下面有1个【初级教程】分组栏,里面有2个按钮【btn_front.cs】和【btn_back.cs】。

2、按钮图标设置

下面要对按钮做一下设置,目前按钮的图标是默认的,我们用自己的图片替换一下。

先准备好图片,格式为PNG,需要2种尺寸,32*32和16*16。

一个小TIPS,Arcgis软件安装后,本地就有一些图片可以用。

在当前工程下的【Images】文件夹,把需要的png放进去,方便管理。

下面是比较关键的一步,在VS里多选这几张图片,在属性栏中,将生成操作设置为【内容】。

回到【Config.daml】中,找到<controls>,新建的2个button在这里,顺便修改一下它们的caption。

然后将它们的smallImage和LargeImage分别设置为图片在工程中的相对路径。

因为VS调试的热重载对UI部分的变化不会起作用。因此需要关闭刚才启用的调试,并再次点击调试。

点击调试后,在启动的ArcGIS Pro里查看,已更新成我们自己设置的图片:

3、把按钮的启动位置设置到图层的右键菜单里

这个工具的功能是设置图层的位置,因此将按钮的启动位置整合到图层的右键菜单里更为方便一些。

打开【Config.daml】,在<insertModule>后面插入一个<updateModule>模板,refID设为【esri_mapping】。(建议这部分直接抄一下我的源代码,再手动修改。)

添加2个<updateMenu>,refID分别为【esri_mapping_layerContextMenu】和【esri_mapping_unregisteredLayerContextMenu】,分别代表的是数据库要素和SHP要素的右键菜单,二者都不可缺少。

<updateMenu>下面放置<insertButton>,refID设置为我们添加的2个按钮的id即可。

insert和placeWith是为了控制按钮在菜单中的位置,截图中设置的结果是放在ID为【esri_mapping_copySelectedLayersButton】的【复制】按键前面。这个可自行设置。

设置完成,再次重新调试,可以看到结果如上。

至此,前端UI部分的工作已经完成。


三、后端

1、后置按钮的点击事件

打开【btn_back.cs】,在OnClick事件下写我们的主要代码。

ArcGIS Pro SDK的大部分接口都需要异步执行。

(异步的知识点可以看下这个:ArcGIS Pro中的多线程)。

因此,我习惯于把所有代码都放在QueuedTask下,如果遇到UI部分的内容再单独处理。

同时OnClick事件上需要加一个修饰符async表示异步:

主流程部分比较简单,先获取工程当前地图中的所有选定的图层,再把图层逐个移动到最底层即可。

cs 复制代码
protected override async void OnClick()
{
    await QueuedTask.Run(() =>
    {
        // 获取工程的当前地图
        Map map = MapView.Active.Map;

        // 获取工程当前地图中的所有选定的图层
        // 并返回一个图层列表
        List<Layer> lys = MapView.Active.GetSelectedLayers().ToList();

        // 对列表循环处理
        foreach (Layer ly in lys)
        {
            // 把图层移动到最底层,index参数为-1
            map.MoveLayer(ly, -1);
        }
    });
}

2、前置按钮的点击事件

前置按钮的代码基本上差不多,不过有一点要注意,需要对图层列表进行一个倒排,因为将选定的多个图层一个一个移动到顶层时,结果顺序是反的,所以要先倒排一下列表再移动。

cs 复制代码
protected override async void OnClick()
{
    await QueuedTask.Run(() =>
    {
        // 获取工程的当前地图
        Map map = MapView.Active.Map;

        // 获取工程当前地图中的所有选定的图层
        // 并返回一个图层列表
        List<Layer> lys = MapView.Active.GetSelectedLayers().ToList();

        // 对图层列表进行一个倒排
        // 因为将选定的多个图层一个一个移动到顶层时,结果顺序是反的,所以要先倒排一下列表再移动
        lys.Reverse();

        // 对列表循环处理
        foreach (Layer ly in lys)
        {
            // 把图层移动到最顶层,index参数为0
            map.MoveLayer(ly, 0);
        }
    });
}

四、调试

点击调试,如图所示,选定【图层2和图层3】,右键点击后置:

点击前置:

完美。


五、工程文件下载

工程文件地址如下,在文件夹中找到【要素图层的前置后置】下载即可。

【ArcGIS Pro二次开发实例教程】原代码合集https://pan.baidu.com/s/1HuS7engSHi1uK1sl70xtAQ?pwd=d6ji

相关推荐
杨超越luckly4 小时前
Python应用指南:高德交通态势数据
python·arcgis·数据挖掘·数据分析·交通态势
小彭努力中4 小时前
58.在 Vue 3 中使用 OpenLayers 绘制点、线、圆、多边形
前端·javascript·vue.js·arcgis·ecmascript·openlayers
鸿业远图科技7 小时前
安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评
arcgis
m0_748235617 小时前
搭建Node.js后端
arcgis·node.js
yfs102416 小时前
ArcGis通过TIFF文件生成渔网
arcgis
鸿业远图科技16 小时前
安徽省地图arcgis数据美化后mxd文件shp格式下载后内容测评
arcgis
鸿业远图科技16 小时前
内蒙古水系详细很全shp格式arcgis软件无偏移坐标下载后内容测评
arcgis
鸿业远图科技2 天前
新疆乡镇界面图层arcgis格式shp数据有乡镇名称和编码2020年wgs84坐标无偏移数据内容测评
android·arcgis
规划GIS会2 天前
【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值
arcgis·二次开发·arcgis pro