I have a collection of features that I create in code to mimic as if my data had a FeatureLayer. I have the Features properly showing up on the map and I can even identify the feature when tapped and output the data from the backing fields. However, I don't see any of the Select methods that are used in FeatureLayers. I prodded around and did find a hack to get to the method call:
var identifyResults = await MyMapView.IdentifyLayerAsync(MyFeatureCollectionLayer, tapScreenPoint, pixelTolerance, onlyReturnPopups, maximumResults);
var fcl = identifyResults.SublayerResults.FirstOrDefault();
if (fcl != null)
{
foreach (Esri.ArcGISRuntime.Data.GeoElement idElement in fcl.GeoElements)
{
Esri.ArcGISRuntime.Data.Feature idFeature = idElement as Esri.ArcGISRuntime.Data.Feature;//fcl.SelectFeature(idFeature); // No methods for selection!!!
MyFeatureCollectionLayer.FeatureCollection.Tables[0].FeatureLayer.SelectFeature(idFeature);
CalloutDefinition callout = new CalloutDefinition(idFeature.Attributes["Number"].ToString(), idFeature.Attributes["Location"].ToString());
MyMapView.ShowCalloutAt(e.Location, callout);
}
}
However, if I get a reference to that FeatureLayer and try to perform the same IdentifyLayerAsync it won't return any results. Should/will FeatureCollectionLayers have a SelectFeature() method? Am I using the wrong tooling (for adding POCO data to a map)? I had tried doing this with a GraphicsOverlay but ran into issues with interacting with the data -queries, filters, etc.
Solved! Go to Solution.
Hi Mike,
I ran your code with a couple of small modifications on a FeatureCollectionLayer I created and it selects without issues. See below please.
private async void MapView_GeoViewTapped(object sender, Esri.ArcGISRuntime.UI.Controls.GeoViewInputEventArgs e)
{
// get reference to MapView
var mapView = sender as MapView;
// get the first operational layer in the map (I only added one layer so this should find the layer I'm looking for)
var layer = mapView.Map.OperationalLayers[0] as FeatureCollectionLayer;
// get the tap location in screen units
var tapScreenPoint = e.Position;
// set identify parameters
var pixelTolerance = 100;
var returnPopupsOnly = false;
var maxResultCount = 5;
if (layer != null)
{
// call the identify operation
var identifyResults = await mapView.IdentifyLayerAsync(layer, tapScreenPoint, pixelTolerance, returnPopupsOnly, maxResultCount);
// get the layer containing the identify results
var fcl = identifyResults.SublayerResults.FirstOrDefault();
if (fcl != null)
{
// get every feature that was identified
foreach (Esri.ArcGISRuntime.Data.GeoElement idElement in fcl.GeoElements)
{
var idFeature = idElement as Feature;
// select feature
layer.Layers[0].SelectFeature(idFeature);
}
}
}
}
Hi Mike,
I ran your code with a couple of small modifications on a FeatureCollectionLayer I created and it selects without issues. See below please.
private async void MapView_GeoViewTapped(object sender, Esri.ArcGISRuntime.UI.Controls.GeoViewInputEventArgs e)
{
// get reference to MapView
var mapView = sender as MapView;
// get the first operational layer in the map (I only added one layer so this should find the layer I'm looking for)
var layer = mapView.Map.OperationalLayers[0] as FeatureCollectionLayer;
// get the tap location in screen units
var tapScreenPoint = e.Position;
// set identify parameters
var pixelTolerance = 100;
var returnPopupsOnly = false;
var maxResultCount = 5;
if (layer != null)
{
// call the identify operation
var identifyResults = await mapView.IdentifyLayerAsync(layer, tapScreenPoint, pixelTolerance, returnPopupsOnly, maxResultCount);
// get the layer containing the identify results
var fcl = identifyResults.SublayerResults.FirstOrDefault();
if (fcl != null)
{
// get every feature that was identified
foreach (Esri.ArcGISRuntime.Data.GeoElement idElement in fcl.GeoElements)
{
var idFeature = idElement as Feature;
// select feature
layer.Layers[0].SelectFeature(idFeature);
}
}
}
}