Skip to content

ProGuide Feature Selection

UmaHarano edited this page May 6, 2024 · 20 revisions
Language:      C#
Subject:       Map Exploration
Contributor:   ArcGIS Pro SDK Team <arcgisprosdk@esri.com>
Organization:  Esri, http://www.esri.com
Date:          04/04/2024
ArcGIS Pro:    3.3
Visual Studio: 2022

This guide demonstrates how to create a simple map tool for feature selection. See ProConcepts Map Exploration, MapTool for more information on the MapTool pattern.

Prerequisites

  • Download and install the sample data required for this guide as instructed in ArcGIS Pro SDK Community Samples Releases.
  • Create a new ArcGIS Pro Module Add-in, and name the project MapToolSelect. If you are not familiar with the ArcGIS Pro SDK, you can follow the steps in the ProGuide Build your first add-in to get started.
  • Add a new ArcGIS Pro Add-ins | ArcGIS Pro Map Tool item to the add-in project, and name the item MapToolSelect.

Step 1

Modify the Config.daml file tool item as follows:

  • Change the caption to "Select Features".
  • Change the tool heading to "Select Features" and the ToolTip text to "Select features on the current map using a rectangular sketch."
...
<tool id="MapToolSelect_MapToolSelect" caption="Select Features" 
      className="MapToolSelect" loadOnClick="true" keytip="TS"
      smallImage="GenericButtonRed16" largeImage="GenericButtonRed32" 
      condition="esri_mapping_mapPane">
  <tooltip heading="Select Features">
    Select features on the current map using a rectangular sketch.
    <disabledText />
  </tooltip>
</tool>
...

Build the sample and validate the UI on the ArcGIS Pro ribbon.

1Tooltip.png

Step 2

The required feature selection functions must be implemented in the MapToolSelect class.
First, SketchOutputMode in the constructor is changed to SketchOutputMode.Screen. MapView.SelectFeatures and MapView.GetFeatures throw a System.ArgumentException if a 3D query is attempted in SketchOutputMode.Map, so you need to change the sketch projection to screen coordinates.

public MapToolSelect()
{
    IsSketchTool = true;
    SketchType = SketchGeometryType.Rectangle;
    SketchOutputMode = SketchOutputMode.Screen;
}

Note: If IsSketchTool is not set to true, the map view will not switch to sketching mode when the tool is activated, and a sketch will not be produced.

The OnSketchCompleteAsync method can be overwritten to implement the required selection functionality. The MapTool base class provides an ActiveMapView property that provides a link to the current active map view. The MapView, in turn, provides a method that can be used to select features that intersect a given geometry.

protected override Task<bool> OnSketchCompleteAsync(Geometry geometry)
{
    return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        // Using the active map view to select
        // the features that intersect the sketch geometry
        ActiveMapView.SelectFeatures(geometry);
        return true;
    });
}

Note: ActiveMapView is a property provided by the MapTool base class; however, the same reference can also be obtained from the MapView class as shown below.

// Get the active map view
var mapView = MapView.Active;
if (mapView != null) { // Use map view here }

Step 3

Rebuild the add-in. Fix any compilation errors.

Step 4

Debug the add-in. Run the debugger and start ArcGIS Pro. Open the C:\Data\Interacting with Maps\Interacting with Maps.aprx project that contains a 3D map with feature data. Try the selection tool on the 3D scene as shown here:

1MapTool3D.png

Close Pro and return to Visual Studio.

Step 5

Return to the OnSketchCompleteAsync routine. Replace the ActiveMapView.SelectFeatures(geometry); line with the following code

  protected override Task<bool> OnSketchCompleteAsync(Geometry geometry)
  {
    return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
      // Using the active map view to select
      // the features that intersect the sketch geometry
      SelectionSet selection = ActiveMapView.SelectFeatures(geometry);

      var numFeatures = selection.Count;

      // iterate the set of features returned
      var selectionDict = selection.ToDictionary();
      foreach (var kvp in selectionDict)
      {
        MapMember mapMember = kvp.Key;
        List<long> oids = kvp.Value;

        // OR use the dictionary w mapMember as the key
        // oids = selectionDict[mapMember];
      }

      return true;
    });
  }

The SelectionSet object is new at 3.0. It replaces the generic .NET collection of IEnumerable<KeyValuePair<MapMember,List<long>>> which methods such as MapView.SelectFeatures returned or consumed. You can return to this enumeration structure by referencing the ToDictionary method as shown above. Similarly, a SelectionSet can be constructed from an enumeration by using the FromDictionary static method. For example

      SelectionSet selection = SelectionSet.FromDictionary(enumFeatures);

Place a breakpoint in this method, start ArcGIS Pro, activate the tool and sketch on the map to select features. Step through the lines of code to verify the features that are returned. Close Pro when finished.

Developing with ArcGIS Pro

    Migration


Framework

    Add-ins

    Configurations

    Customization

    Styling


Arcade


Content


CoreHost


DataReviewer


Editing


Geodatabase

    3D Analyst Data

    Plugin Datasources

    Topology

    Object Model Diagram


Geometry

    Relational Operations


Geoprocessing


Knowledge Graph


Layouts

    Reports


Map Authoring

    3D Analyst

    CIM

    Graphics

    Scene

    Stream

    Voxel


Map Exploration

    Map Tools


Networks

    Network Diagrams


Parcel Fabric


Raster


Sharing


Tasks


Workflow Manager Classic


Workflow Manager


Reference

Clone this wiki locally