当前位置: 首页 > article >正文

【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表示异步:

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

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、前置按钮的点击事件

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

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二次开发实例教程】原代码合集icon-default.png?t=O83Ahttps://pan.baidu.com/s/1HuS7engSHi1uK1sl70xtAQ?pwd=d6ji


http://www.kler.cn/a/468354.html

相关文章:

  • C# 设计模式(结构型模式):外观模式
  • GWAS数据和软件下载
  • C++相关实验练习
  • 条件期望窥探
  • C++11——2:可变模板参数
  • 后台运行 Python
  • Image和Video在同一个Dataloader中交错加载联合训练
  • vue 处理二进制文件流下载,封装请求
  • create-a-weather-app-using-flask-python
  • pytorch张量列表索引和多维度张量索引比较
  • ElasticSearch10-性能优化
  • 左神算法基础巩固--2
  • 深入MySQL复杂查询优化技巧
  • Nginx:性能优化
  • 【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)
  • Hadoop•FinalShell连接VMware免密登录
  • centos7搭建大数据集群环境准备--安装java和scala环境
  • Lua语言的数据结构
  • (Pytorch)torch.autograd.grad()与torch.autograd.backward()
  • 爬取数据时如何设置合适的请求频率?
  • 八大排序算法,快排的三种递归非递归实现,归并的递归非递归实现,排序算法复杂度及稳定性分析【有图解】
  • Vue3实现PDF在线预览功能
  • 解析 SQL 中的 NULL 与比较操作:NULL 值与任何值的比较会返回 UNKNOWN
  • Visual Studio C++使用笔记
  • 【数学建模笔记】评价模型-基于熵权法的TOPSIS模型
  • PyTorch通过搭建LSTM网络,对MNIST手写数字数据集进行了训练和评估,实现了对手写数字的分类功能