【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

相关推荐
敲敲敲-敲代码15 小时前
【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程
arcgis
星火19131419 小时前
arcgis jsapi 4.31 调用geoserver 发布的wms服务
arcgis·geoserver
规划GIS会2 天前
ima知识库第二弹,Python for ArcGIS Pro | 简简单单写个脚本工具
开发语言·python·arcgis
小艳加油2 天前
MaxEnt物种分布建模全流程;R+ArcGIS+MaxEnt模型物种分布模拟、参数优化方法、结果分析制图与论文写作
arcgis·r语言·物种分布模拟·maxent模型
生信学习小达人3 天前
在ArcGIS中导入气候tif文件出现 “输入与输出之间的基准面冲突” 警告
arcgis
敲敲敲-敲代码3 天前
【ArcGIS操作】ArcGIS 进行空间聚类分析
arcgis
xa138508695 天前
ARCGIS PRO SDK VB2022 图层要素类类型判断
arcgis
weixin_贾6 天前
AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
arcgis·swat模型·面源污染
xa138508696 天前
ARCGIS PRO SDK ProWindow自定义窗口DataGrid控件的应用
arcgis
赵钰老师7 天前
【Nature顶刊级科研绘图】DeepSeek、ChatGPT等大语言模型绘图(如何画图、如何标注、如何改图、如何美化、如何组合、如何排序)
人工智能·arcgis·信息可视化·语言模型·r语言