Query

A query provides the ability to return a subset of features from a dataset based on any combination of attribute, spatial, and temporal (time) criteria.

  • Attribute criteria are defined with a standard SQL expression based on the available attribute fields.
  • Spatial criteria use a geometry and a spatial relationship (within, contains, intersect, and so on).
  • A temporal filter can be defined using a single date or time, or a range.

You can also perform queries to return related features, a feature count, an extent containing all features meeting your criteria, or statistical information about a dataset.

Relevant classes and members in the API ref

How query works

Query criteria is defined using a query parameters object. This is where you specify the attribute, spatial, and/or temporal inputs. Most ArcGIS Runtime queries take query parameters as an input to define the query criteria as well as some preferences for the results. When the query is executed against a specific dataset (feature table), results are returned as a collection of features.

A query does not require that each type of criteria be defined. Query criteria are only evaluated if explicitly defined (missing temporal criteria, for example, means not to filter the results according to time).

Query parameters

Query parameters define the query criteria using:

  • An SQL expression for attribute criteria
  • Geometry and a spatial relationship for spatial criteria
  • A date/time or a range of dates/times for temporal criteria

Some spatial relationships you can define for the query include:

  • Intersects: part of a feature is contained in the geometry.
  • Touches: a feature touches the border of the geometry.
  • Crosses: a feature crosses the geometry.
  • Within: a feature is completely enclosed by the geometry.
  • Contains: part or all of a feature is contained within the geometry.

The query parameters can be used in a standard query to return features, or in queries that return a feature count or extent. You can also use the query parameters to make a selection in the map showing the features that match the criteria.

Specialized query parameters are used for queries that return statistics or related features. In addition to query criteria, these query parameters define things like the type of statistics to return or the relationships to evaluate.

This example uses spatial criteria to find features inside a polygon. Instead of executing a query on the FeatureTable, however, the query parameters are simply passed to the FeatureLayer to display features that meet the criteria as a new selection.

                                                                                                                   
// --- Edit ---

private async void AddDamageFeature(MapPoint structureLocation, string type, string cause)
{
    var attributes = new Dictionary();
    attributes.Add("typdamage", type);
    attributes.Add("primcause", cause);

    // create a new feature in the damage table, pass in the attributes and geometry
    var newFeature = _damagePointsTable.CreateFeature(attributes, structureLocation);
    // add the new feature (this updates the local copy of the table)
    await _damagePointsTable.AddFeatureAsync(newFeature);

    // push this update (apply edits) to the feature service
    IReadOnlyList editResults = await _damagePointsTable.ApplyEditsAsync();
    // check the results for errors
    foreach (var r in editResults)
    {
        if (r.CompletedWithErrors)
        {
            Console.WriteLine("Edit to Object '" + r.ObjectId + "' failed: " + r.Error.Message);
        }
    }
}



// get all selected features in the layer
var damageLayer = MyMapView.Map.OperationalLayers[0] as FeatureLayer;
var selectedFeatures = await damageLayer.GetSelectedFeaturesAsync();

// loop through all features in the selection
foreach (ArcGISFeature f in selectedFeatures)
{
    // load the feature
    await f.LoadAsync();

    // update the damage type attribute
    f.Attributes["typdamage"] = "Inaccessible";

    // get the feature's geometry (point), move it to the north
    var location = f.Geometry as MapPoint;
    var newLocation = new MapPoint(location.X, location.Y + 50000);

    // set the feature's new location
    f.Geometry = newLocation;

    // update the feature in the local cache with these edits
    await _damagePointsTable.UpdateFeatureAsync(f);
}

// apply all the edits back to the service feature table
var editResults = await _damagePointsTable.ApplyEditsAsync();



// get all selected features in the layer
var damageLayer = MyMapView.Map.OperationalLayers[0] as FeatureLayer;
var selectedFeatures = await damageLayer.GetSelectedFeaturesAsync();

// delete the selected features from the local cache
await _damagePointsTable.DeleteFeaturesAsync(selectedFeatures);

// apply all the edits back to the service feature table
var editResults = await _damagePointsTable.ApplyEditsAsync();


// --- Query ---


// Build a buffer (polygon) around a click point
var buffer = GeometryEngine.Buffer(queryPoint, 5000);

// Use the buffer to define the geometry for a query
var query = new QueryParameters();
query.Geometry = buffer;
query.SpatialRelationship = SpatialRelationship.Contains;

// Select features in a feature layer using the query
await damageLayer.SelectFeaturesAsync(query, Esri.ArcGISRuntime.Mapping.SelectionMode.New);



// TODO:



// TODO:



// TODO:



var layer = MyMapView.Map.OperationalLayers[0];
var pixelTolerance = 20;
var returnPopupsOnly = false;
var maxResults = 5;

// identify a layer using MapView, passing in the layer, the tap point, tolerance, types to return, and max results
IdentifyLayerResult idResults = await MyMapView.IdentifyLayerAsync(layer, tapScreenPoint, pixelTolerance, returnPopupsOnly, maxResults);

// get the layer identified and cast it to FeatureLayer
FeatureLayer idLayer = idResults.LayerContent as FeatureLayer;

// iterate each identified GeoElement in the results
foreach (GeoElement idElement in idResults.GeoElements)
{
    // cast the result GeoElement to Feature
    Feature idFeature = idElement as Feature;

    // select this feature in the feature layer
    idLayer.SelectFeature(idFeature);
}

Query results

Query results typically provide a collection of features. You can iterate the result features to display them on the map, read their attributes, and so on. A query for statistics returns a collection of records that describe the requested statistics for features in the dataset. Queries for feature count or extent return a number and an envelope respectively.

Geometry for the query results can be returned in a specified spatial reference by specifying the output spatial reference in the query parameters. If a spatial reference is not specified, results will be returned in the spatial reference of the dataset. Most often, you will need the result features in the same spatial reference as your app's map.

You can also set a maximum number of features to return in the result. This is useful in situations where you might only need a subset of features that meet your criteria. It may also improve performance by limiting the amount of information returned with the result.

Identify

Identify is like a shortcut for a spatial query. It allows you to quickly answer the question: what is here? It gives users a quick way to explore and learn about the map or scene content by tapping or clicking. Information returned from an identify operation can be shown in pop-ups or other UI components in your app. Unlike a query, you can't provide attribute or time criteria to filter results. You can, however, return all geoelements (from all layers) at the specified location.

                                                                                                                   
// --- Edit ---

private async void AddDamageFeature(MapPoint structureLocation, string type, string cause)
{
    var attributes = new Dictionary();
    attributes.Add("typdamage", type);
    attributes.Add("primcause", cause);

    // create a new feature in the damage table, pass in the attributes and geometry
    var newFeature = _damagePointsTable.CreateFeature(attributes, structureLocation);
    // add the new feature (this updates the local copy of the table)
    await _damagePointsTable.AddFeatureAsync(newFeature);

    // push this update (apply edits) to the feature service
    IReadOnlyList editResults = await _damagePointsTable.ApplyEditsAsync();
    // check the results for errors
    foreach (var r in editResults)
    {
        if (r.CompletedWithErrors)
        {
            Console.WriteLine("Edit to Object '" + r.ObjectId + "' failed: " + r.Error.Message);
        }
    }
}



// get all selected features in the layer
var damageLayer = MyMapView.Map.OperationalLayers[0] as FeatureLayer;
var selectedFeatures = await damageLayer.GetSelectedFeaturesAsync();

// loop through all features in the selection
foreach (ArcGISFeature f in selectedFeatures)
{
    // load the feature
    await f.LoadAsync();

    // update the damage type attribute
    f.Attributes["typdamage"] = "Inaccessible";

    // get the feature's geometry (point), move it to the north
    var location = f.Geometry as MapPoint;
    var newLocation = new MapPoint(location.X, location.Y + 50000);

    // set the feature's new location
    f.Geometry = newLocation;

    // update the feature in the local cache with these edits
    await _damagePointsTable.UpdateFeatureAsync(f);
}

// apply all the edits back to the service feature table
var editResults = await _damagePointsTable.ApplyEditsAsync();



// get all selected features in the layer
var damageLayer = MyMapView.Map.OperationalLayers[0] as FeatureLayer;
var selectedFeatures = await damageLayer.GetSelectedFeaturesAsync();

// delete the selected features from the local cache
await _damagePointsTable.DeleteFeaturesAsync(selectedFeatures);

// apply all the edits back to the service feature table
var editResults = await _damagePointsTable.ApplyEditsAsync();


// --- Query ---


// Build a buffer (polygon) around a click point
var buffer = GeometryEngine.Buffer(queryPoint, 5000);

// Use the buffer to define the geometry for a query
var query = new QueryParameters();
query.Geometry = buffer;
query.SpatialRelationship = SpatialRelationship.Contains;

// Select features in a feature layer using the query
await damageLayer.SelectFeaturesAsync(query, Esri.ArcGISRuntime.Mapping.SelectionMode.New);



// TODO:



// TODO:



// TODO:



var layer = MyMapView.Map.OperationalLayers[0];
var pixelTolerance = 20;
var returnPopupsOnly = false;
var maxResults = 5;

// identify a layer using MapView, passing in the layer, the tap point, tolerance, types to return, and max results
IdentifyLayerResult idResults = await MyMapView.IdentifyLayerAsync(layer, tapScreenPoint, pixelTolerance, returnPopupsOnly, maxResults);

// get the layer identified and cast it to FeatureLayer
FeatureLayer idLayer = idResults.LayerContent as FeatureLayer;

// iterate each identified GeoElement in the results
foreach (GeoElement idElement in idResults.GeoElements)
{
    // cast the result GeoElement to Feature
    Feature idFeature = idElement as Feature;

    // select this feature in the feature layer
    idLayer.SelectFeature(idFeature);
}

Samples