Hi,
I am trying to develop a WPF app that can populate a datagrid by querying an online image service. http://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer Particularly, I want to search for a name from the sublayers (search for a city, county, or state) and populate the result in a datagrid. I am attaching an image of the result that I want to have and an image of error message that I got. Also I am attaching the code file.
please help
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Tasks;
using Esri.ArcGISRuntime.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MapApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Map myMap = new Map(Basemap.CreateImagery());
ArcGISMapImageLayer layer = new ArcGISMapImageLayer(new Uri("http://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer"));
myMap.OperationalLayers.Add(layer);
MyMapView.Map = myMap;
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
ArcGISMapImageLayer usaMapImageLayer = (ArcGISMapImageLayer)MyMapView.Map.OperationalLayers[0];
try
{
// Use a utility method on the map image layer to load all the sublayers and tables.
await usaMapImageLayer.LoadTablesAndLayersAsync();
// Get the sublayers of interest.
ArcGISMapImageSublayer citiesSublayer = (ArcGISMapImageSublayer)usaMapImageLayer.Sublayers[0];
ArcGISMapImageSublayer countiesSublayer = (ArcGISMapImageSublayer)usaMapImageLayer.Sublayers[3];
ArcGISMapImageSublayer statesSublayer = (ArcGISMapImageSublayer)usaMapImageLayer.Sublayers[2];
// Get the service feature table for each of the sublayers.
ServiceFeatureTable citiesTable = citiesSublayer.Table;
ServiceFeatureTable countiesTable = countiesSublayer.Table;
ServiceFeatureTable statesTable = statesSublayer.Table;
// Create the query parameters that will find features.
QueryParameters citiesNameQuery = new QueryParameters
{
WhereClause = "AREANAME=" + SearchTextBox.Text,
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters countiesNameQuery = new QueryParameters
{
WhereClause = "NAME=" + SearchTextBox.Text,
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters statesNameQuery = new QueryParameters
{
WhereClause = "STATE_NAME=" + SearchTextBox.Text,
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
// Query each of the sublayers with the query parameters.
FeatureQueryResult citiesQueryResult = await citiesTable.QueryFeaturesAsync(citiesNameQuery);
FeatureQueryResult countiesQueryResult = await citiesTable.QueryFeaturesAsync(countiesNameQuery);
FeatureQueryResult statesQueryResult = await citiesTable.QueryFeaturesAsync(statesNameQuery);
var foundCities = 0;
var foundCounties = 0;
var foundStates = 0;
// Loop through results, count the matches found in each layer.
foreach (Feature city in citiesQueryResult)
{
foundCities++;
}
foreach (Feature county in countiesQueryResult)
{
foundCounties++;
}
foreach (Feature states in statesQueryResult)
{
foundStates++;
}
// Report the number of matches for each layer.
var msg = $"Found {foundCities} cities, {foundCounties} counties, and {foundStates} states containing {SearchTextBox.Text}" +
$"in a Name attribute.";
MessageBox.Show(msg);
// Bind the results to a DataGrid Control on the page
MyDataGrid.ItemsSource = citiesQueryResult;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error");
}
}
}
}
Thanks
Solved! Go to Solution.
You have 2 issues in your code. That's the correct way.
WhereClauses are missing a quote:
QueryParameters citiesNameQuery = new QueryParameters
{
WhereClause = $"AREANAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters countiesNameQuery = new QueryParameters
{
WhereClause = $"NAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters statesNameQuery = new QueryParameters
{
WhereClause = $"STATE_NAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
And you referenced the same table three times, you need to use the associated tables:
FeatureQueryResult citiesQueryResult = await citiesTable.QueryFeaturesAsync(citiesNameQuery);
FeatureQueryResult countiesQueryResult = await countiesTable.QueryFeaturesAsync(countiesNameQuery);
FeatureQueryResult statesQueryResult = await statesTable.QueryFeaturesAsync(statesNameQuery);
Then it will work.
Thanks MaximilianGlas. This worked well for me. But still I am not able show the results in the data grid. I tried to bind the query results to the datagrid using the following code.
Code Snippet
// Query each of the sublayers with the query parameters.
FeatureQueryResult citiesQueryResult = await citiesTable.QueryFeaturesAsync(citiesNameQuery);
FeatureQueryResult countiesQueryResult = await countiesTable.QueryFeaturesAsync(countiesNameQuery);
FeatureQueryResult statesQueryResult = await statesTable.QueryFeaturesAsync(statesNameQuery);
var foundCities = 0;
var foundCounties = 0;
var foundStates = 0;
// Loop through results, count the matches found in each layer.
foreach (Feature city in citiesQueryResult)
{
foundCities++;
}
foreach (Feature county in countiesQueryResult)
{
foundCounties++;
}
foreach (Feature states in statesQueryResult)
{
foundStates++;
}
// Report the number of matches for each layer.
var msg = $"Found {foundCities} cities, {foundCounties} counties, and {foundStates} states containing {SearchTextBox.Text}" +
$" in a Name attribute.";
MessageBox.Show(msg);
// Bind the results to a DataGrid Control on the page
MyDataGrid.ItemsSource = citiesQueryResult;
MyDataGrid.ItemsSource = countiesQueryResult;
MyDataGrid.ItemsSource = statesQueryResult;
}
You have 2 issues in your code. That's the correct way.
WhereClauses are missing a quote:
QueryParameters citiesNameQuery = new QueryParameters
{
WhereClause = $"AREANAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters countiesNameQuery = new QueryParameters
{
WhereClause = $"NAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
QueryParameters statesNameQuery = new QueryParameters
{
WhereClause = $"STATE_NAME='{SearchTextBox.Text}'",
Geometry = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry).TargetGeometry,
OutSpatialReference = MyMapView.SpatialReference
};
And you referenced the same table three times, you need to use the associated tables:
FeatureQueryResult citiesQueryResult = await citiesTable.QueryFeaturesAsync(citiesNameQuery);
FeatureQueryResult countiesQueryResult = await countiesTable.QueryFeaturesAsync(countiesNameQuery);
FeatureQueryResult statesQueryResult = await statesTable.QueryFeaturesAsync(statesNameQuery);
Then it will work.
Thanks MaximilianGlas. This worked well for me. But still I am not able show the results in the data grid. I tried to bind the query results to the datagrid using the following code.
Code Snippet
// Query each of the sublayers with the query parameters.
FeatureQueryResult citiesQueryResult = await citiesTable.QueryFeaturesAsync(citiesNameQuery);
FeatureQueryResult countiesQueryResult = await countiesTable.QueryFeaturesAsync(countiesNameQuery);
FeatureQueryResult statesQueryResult = await statesTable.QueryFeaturesAsync(statesNameQuery);
var foundCities = 0;
var foundCounties = 0;
var foundStates = 0;
// Loop through results, count the matches found in each layer.
foreach (Feature city in citiesQueryResult)
{
foundCities++;
}
foreach (Feature county in countiesQueryResult)
{
foundCounties++;
}
foreach (Feature states in statesQueryResult)
{
foundStates++;
}
// Report the number of matches for each layer.
var msg = $"Found {foundCities} cities, {foundCounties} counties, and {foundStates} states containing {SearchTextBox.Text}" +
$" in a Name attribute.";
MessageBox.Show(msg);
// Bind the results to a DataGrid Control on the page
MyDataGrid.ItemsSource = citiesQueryResult;
MyDataGrid.ItemsSource = countiesQueryResult;
MyDataGrid.ItemsSource = statesQueryResult;
}