构建地图识别工具

本教程演示如何使用自定义地图识别工具创建ArcGIS Pro插件。
使用ArcGIS Pro SDK for.NET,您可以使用自己独特的工具和工作流扩展ArcGIS专业版。使用Microsoft Visual Studio和Pro SDK,开发人员可以构建Pro加载项和解决方案配置,为用户提供特定于其组织或行业的自定义功能。
在本教程中,您将使用C#创建用于要素识别的新地图工具,该工具允许您在地图上绘制圆形选择区域,并查看在选择区域内找到的每个要素图层的要素总数。

有关详细信息,请参见ArcGIS Pro wiki地图浏览和地图工具。或查看ArcGIS Pro SDK API参考。有关更多示例,请参见ArcGIS Pro用户社区的地图探索示例

要求

arcgis pro 3.0
vs2022
资料

创建新的ArcGIS Pro加载项的Visual Studio项目

启动vs2022
选择文件>新建>项目,然后从ArcGIS模板组中选择ArcGIS Pro模块插件。将外接程序项目命名为“MapToolIdentify”。
在这里插入图片描述
在这里插入图片描述
默认情况下,Config.daml文件在VisualStudio中打开。Module1.cs文件包含外接程序模块代码。
另请注意配置。insertModule标记的id属性与Module1.cs文件中的id匹配,并且className属性与模块的类名匹配。
在这里插入图片描述
在这里插入图片描述

创建新的Arcgis Pro 地图工具

右键单击项目并选择“添加”>“新建项目”,然后从“ArcGIS Pro插件”组中,从项目模板列表中选择“ArcGIS Pro地图工具”。将新类文件命名为IdentifyTool.cs,然后单击添加以关闭对话框。
在这里插入图片描述一旦添加完成IdentifyTool.cs默认会被打开。Map Tool模板提供类文件的内容以及Config中的相应代码。用于ArcGIS Pro UI的daml文件,因此可以激活该工具。配置。应该首先更新daml。
打开Config.daml文件并修改工具项,如以下代码所示:

   <tool id="MapToolIdentify_IdentifyTool"
         caption="Identify Features"
         className="IdentifyTool"
         loadOnClick="true"
         smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonRed16.png"
         largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonRed32.png"
         condition="esri_mapping_mapPane">
      <tooltip heading="Identify Features">Identify features on the current map using a circular sketch.<disabledText /></tooltip>
   </tool>

在这里插入图片描述编译和构建项目
编译成功之后启动调试,打开Interacting with Maps在这里插入图片描述
单击“附加模块”选项卡,确认新地图工具UI显示在功能区上,其中包含标题、工具提示和步骤4中的其他修改。
关闭ArcGIS Pro并停止调试。
在这里插入图片描述

创建识别地图工具代码并测试

打开IdentifyTool.cs,添加引用

 using ArcGIS.Desktop.Framework.Threading.Tasks;
 using ArcGIS.Desktop.Framework.Dialogs;

按如下所示修改IdentifyTool()构造函数:

 public IdentifyTool()
 {
       IsSketchTool = true;
       SketchType = SketchGeometryType.Circle;
       SketchOutputMode = SketchOutputMode.Screen;
 }

将IsSketchTool 设置为true
将SketchType 设置为 SketchGeometryType.Circle
将SketchOutputMode设置为SketchOutputMode.Screen
按如下所示修改OnSketchCompleteAsync,将async关键字添加到方法声明中:

using ArcGIS.Core.CIM;
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Catalog;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Editing;
using ArcGIS.Desktop.Extensions;
using ArcGIS.Desktop.Framework;
using ArcGIS.Desktop.Framework.Contracts;
using ArcGIS.Desktop.Framework.Dialogs;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Layouts;
using ArcGIS.Desktop.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MapToolIdentify
{
    internal class IdentifyTool : MapTool
    {
        public IdentifyTool()
        {
            IsSketchTool = true;
            SketchType = SketchGeometryType.Circle;
            SketchOutputMode = SketchOutputMode.Screen;
        }

        protected override Task OnToolActivateAsync(bool active)
        {
            return base.OnToolActivateAsync(active);
        }

        protected override async Task<bool> OnSketchCompleteAsync(Geometry geometry)
        {
            var mv = MapView.Active;//获取激活的窗口
            //QueuedTask用于在前台工作线程上执行异步操作的静态类。
            var identifyResult = await QueuedTask.Run(() =>
            {
                var sb = new StringBuilder();

                // Get the features that intersect the sketch geometry.
                // 获取与草图几何图元相交的特征。
                var features = mv.GetFeatures(geometry);

                // Get all layer definitions.
                // 获取所有图层定义。
                var lyrs = mv.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>();
                foreach (var lyr in lyrs)
                {
                    var fCnt = features.ToDictionary().ContainsKey(lyr) ? features[lyr].Count : 0;
                    sb.AppendLine($@"{fCnt} {(fCnt == 1 ? "record" : "records")} for {lyr.Name}");
                }
                return sb.ToString();
            });
            MessageBox.Show(identifyResult);
            return true;
        }
    }
}

重新编译项目然后运行,打开Interacting with Maps项目
放大地图中包含来自不同要素图层的要素的区域,以确认新的“标识”工具是否按预期工作。单击并按住以定义选择圆的中心点,然后拖动以定义半径。松开鼠标按钮后,将出现一个消息框,其中显示在您定义的圆内找到的可见特征的数量。

标识工具将仅返回可见和可选的要素,如“按图形顺序列出”和“按选择列出”的“内容”窗格中所定义的。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值