Query API Sample Code (C#)
The following C# code provides examples of how to query a data source using the Query API.
using System;
using System.Net;
using System.Xml;
namespace QueryAPIExamples
{
/// <summary>
/// Using the Spatial Data Services Query API to query the test data source FourthCoffeeSample
/// </summary>
public class SpatialDataQuerying
{
string BingMapsKey = "InsertYourBngMapsKeyHere";
string DataSourceID = "20181f26d9e94c81acdf9496133d4f23";
static void Main()
{
SpatialDataQuerying queryTest = new SpatialDataQuerying();
queryTest.RunExampleQueries();
Console.ReadLine();
}
#region Run the Queries
/// <summary>
/// Run the Bing Spatial Data Query examples in this class.
/// Requires the spatial data to already be uploaded.
/// </summary>
public void RunExampleQueries()
{
ExampleFindByAreaRadius();
ExampleFindByBoundingBox();
ExampleFindByProperty();
ExampleQueryByIdAtom();
// ExampleQueryByIdJson();
}
#endregion
#region Query By Area
public void ExampleFindByAreaRadius()
{
Console.WriteLine("\nExampleFindByAreaRadius");
// Find all previously uploaded MyShops entities located within
// a certain radius around a point.
// Custom name of spatial data source created during upload
string dataSourceName = "FourthCoffeeSample";
// Name of entities in the data source
string dataEntityName = "FourthCoffeeShops";
// Unique access ID assigned to your data source by Bing Maps
// e.g. f8986xxxxxxxc844b
string accessId = DataSourceID;
// Your Bing Maps Spatial Data Services query key.
string bingMapsKey = BingMapsKey;
// Coordinates of the point to search from.
double SearchLatitude = 47.63674;
double SearchLongitude = - 122.30413;
// Search radius
double Radius = 3; // km
// Setup REST request to query our uploaded customer data
string requestUrl = string.Format("http://spatial.virtualearth.net/REST/v1/data/{0}/{1}/{2}" +
"?spatialFilter=nearby({3},{4},{5})&key={6}",accessId,dataSourceName,
dataEntityName,SearchLatitude, SearchLongitude, Radius, bingMapsKey);
// Send the request and get back an XML response.
XmlDocument response = GetXmlResponse(requestUrl);
// Display each entity's info.
ProcessEntityElements(response);
}
#endregion
#region Helper Methods
public static XmlDocument GetXmlResponse(string requestUrl)
{
try
{
HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(response.GetResponseStream());
return (xmlDoc);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.Read();
return null;
}
}
/// <summary>
/// Display each "entry" in the Bing Spatial Data Services Atom (XML) response.
/// </summary>
/// <param name="entryElements"></param>
private void ProcessEntityElements(XmlDocument response)
{
XmlNodeList entryElements = response.GetElementsByTagName("entry");
for (int i = 0; i <= entryElements.Count - 1; i++)
{
XmlElement element = (XmlElement)entryElements[i];
XmlElement contentElement = (XmlElement)element.GetElementsByTagName(
"content")[0];
XmlElement propElement = (XmlElement)
contentElement.GetElementsByTagName("m:properties")[0];
XmlNode nameElement = propElement.GetElementsByTagName("d:Name")[0];
if (nameElement == null)
throw new Exception("Name not found");
XmlNode latElement = propElement.GetElementsByTagName("d:Latitude")[0];
if (latElement == null)
throw new Exception("Latitude not found");
XmlNode longElement = propElement.GetElementsByTagName("d:Longitude")
[0];
if (longElement == null)
throw new Exception("Longitude not found");
string name = nameElement.InnerText;
double latitude = 0;
Double.TryParse(latElement.InnerText, out latitude);
double longitude = 0;
Double.TryParse(longElement.InnerText, out longitude);
Console.WriteLine("Coordinates of '{0}': {1}, {2}", name, latitude,
longitude);
}
}
#endregion
#region Query by Property
public void ExampleFindByProperty()
{
Console.WriteLine("\nExampleFindByProperty");
// Find all previously uploaded MyShops entities that accept
// online orders.
// Custom name of spatial data source created during upload
string dataSourceName = "FourthCoffeeSample";
// Name of entities in the data source
string dataEntityName = "FourthCoffeeShops";
// Unique access ID assigned to your data source by Bing Maps
// e.g. f8986xxxxxxxc844b
string accessId = DataSourceID;
// Your Bing Maps Spatial Data Services query key.
string bingMapsKey = BingMapsKey;
// Setup REST request to query our uploaded customer data
string requestUrl = String.Format(
"http://spatial.virtualearth.net/REST/v1/data/{0}/{1}/{2}" +
"?$filter=AcceptsOnlineOrders Eq True&key={3}", accessId,
dataSourceName, dataEntityName, bingMapsKey);
// Send the request and get back an XML response.
XmlDocument response = GetXmlResponse(requestUrl);
// Display each entity's info.
ProcessEntityElements(response);
}
#endregion
#region Query by Bounding Box
public void ExampleFindByBoundingBox()
{
Console.WriteLine("\nExampleFindByBoundingBox");
// Find all previously uploaded MyShops entities located within
// the specified bounding box.
// Custom name of spatial data source created during upload
string dataSourceName = "FourthCoffeeSample";
// Name of entities in the data source
string dataEntityName = "FourthCoffeeShops";
// Unique access ID assigned to your data source by Bing Maps
// e.g. f8986xxxxxxxc844b
string accessId = DataSourceID;
// Your Bing Maps Spatial Data Services query key.
string bingMapsKey = BingMapsKey;
// Coordinates of the bounding box's corners
double lat1 = 47.61247675940658;
double long1 = - 122.3237670214032;
double lat2 = 47.68239156080077;
double long2 = - 122.27996173131822;
// Setup REST request to query our uploaded customer data
string requestUrl = String.Format(
"http://spatial.virtualearth.net/REST/v1/data/{0}/{1}/{2}" +
"?spatialFilter=bbox({3},{4},{5},{6})&key={7}", accessId,
dataSourceName, dataEntityName, lat1, long1, lat2, long2, bingMapsKey);
// Send the request and get back an XML response.
XmlDocument response = GetXmlResponse(requestUrl);
// Display each entity's info.
ProcessEntityElements(response);
}
#endregion
#region Query By ID
/// <summary>
/// Query by ID using ATOM protocol
/// </summary>
public void ExampleQueryByIdAtom()
{
Console.WriteLine("\nExampleQueryByIdAtom");
// http://spatial.virtualearth.net/REST/v1/data/accessId/dataSourceName/entityTypeName('entityId')?key=queryKey
// http://spatial.virtualearth.net/REST/v1/data/f8986xxxxxxxc844b/MyShopsSample/MyShops('1')?key=queryKey
// Custom name of spatial data source created during upload
string dataSourceName = "FourthCoffeeSample";
// Name of entities in the data source
string dataEntityName = "FourthCoffeeShops";
// Unique access ID assigned to your data source by Bing Maps
// e.g. f8986xxxxxxxc844b
string accessId = DataSourceID;
// ID of the entity to search for
int entityId = -22067;
// Your Bing Maps Spatial Data Services query key.
string bingMapsKey = BingMapsKey;
string requestUrl = string.Format("http://spatial.virtualearth.net" +
"/REST/v1/data/{0}/{1}/{2}('{3}')?key={4}", accessId, dataSourceName,
dataEntityName, entityId, bingMapsKey);
// By default, the Spatial Data API returns
// data responses in Atom (xml) format.
XmlDocument xmlResponse = GetXmlResponse(requestUrl);
// Select the first shop data in the xml results.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlResponse.NameTable);
nsmgr.AddNamespace("a", "http://www.w3.org/2005/Atom");
nsmgr.AddNamespace("m",
"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");
nsmgr.AddNamespace("d",
"http://schemas.microsoft.com/ado/2007/08/dataservices");
XmlNode firstShopNode = xmlResponse.SelectSingleNode(
"//a:entry/a:content/m:properties", nsmgr);
// Extract result data from the xml nodes.
int retrievedEntityId = int.Parse(firstShopNode.SelectSingleNode(
"d:EntityID", nsmgr).FirstChild.Value);
string postalCode = firstShopNode.SelectSingleNode(
"d:PostalCode", nsmgr).FirstChild.Value;
double latitude = double.Parse(firstShopNode.SelectSingleNode(
"d:Latitude", nsmgr).FirstChild.Value);
double longitude = double.Parse(firstShopNode.SelectSingleNode(
"d:Longitude", nsmgr).FirstChild.Value);
Console.WriteLine(string.Format("Found EntityID {0} Postal Code: {1} Lat,Lon: ({2},{3})",
retrievedEntityId,postalCode, latitude, longitude));
}
#endregion;
}
}