本教程演示如何使用自定义地图识别工具创建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项目
放大地图中包含来自不同要素图层的要素的区域,以确认新的“标识”工具是否按预期工作。单击并按住以定义选择圆的中心点,然后拖动以定义半径。松开鼠标按钮后,将出现一个消息框,其中显示在您定义的圆内找到的可见特征的数量。
标识工具将仅返回可见和可选的要素,如“按图形顺序列出”和“按选择列出”的“内容”窗格中所定义的。