Query API Sample Code (VB)
The following Visual Basic code provides examples of how to query a data source using the Query API.
Imports System
Imports System.Net
Imports System.Xml
Imports Microsoft.VisualBasic
''' <summary>
''' Using the Spatial Data Services Query API to query the test data source FourthCoffeeSample
''' </summary>
Public Class SpatialDataQuerying
Private MyKey As String = "InsertYourBingMapsKey"
Private DataSourceID As String = "20181f26d9e94c81acdf9496133d4f23"
#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 Sub RunExampleQueries()
ExampleFindByAreaRadius()
ExampleFindByBoundingBox()
ExampleFindByProperty()
ExampleQueryByIdAtom()
' ExampleQueryByIdJson();
End Sub
#End Region
#Region "Query By Area"
Public Sub ExampleFindByAreaRadius()
Console.WriteLine(vbLf & "ExampleFindByAreaRadius")
' Find all previously uploaded MyShops entities located within
' a certain radius around a point.
' Custom name of spatial data source created during upload
Dim dataSourceName As String = "FourthCoffeeSample"
' Name of entities in the data source
Dim dataEntityName As String = "FourthCoffeeShops"
' Unique access ID assigned to your data source by Bing Maps
' e.g. f8986xxxxxxxc844b
Dim accessId As String = DataSourceID
' Your Bing Maps Spatial Data Services query key.
Dim bingMapsKey As String = MyKey
' Coordinates of the point to search from.
Dim SearchLatitude As Double = 47.63674
Dim SearchLongitude As Double = -122.30413
' Search radius
Dim Radius As Double = 3 ' km
' Setup REST request to query our uploaded customer data
Dim requestUrl As String = 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, MyKey)
' Send the request and get back an XML response.
Dim response As XmlDocument = GetXmlResponse(requestUrl)
' Display each entity's info.
ProcessEntityElements(response)
End Sub
#End Region
#Region "Helper Methods"
Public Shared Function GetXmlResponse(ByVal requestUrl As String) As XmlDocument
Try
Dim request As HttpWebRequest = TryCast(WebRequest.Create(requestUrl), HttpWebRequest)
Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse)
Dim xmlDoc As New XmlDocument()
xmlDoc.Load(response.GetResponseStream())
Return (xmlDoc)
Catch e As Exception
Console.WriteLine(e.Message)
Console.Read()
Return Nothing
End Try
End Function
''' <summary>
''' Display each "entry" in the Bing Spatial Data Services Atom (XML) response.
''' </summary>>
Private Sub ProcessEntityElements(ByVal response As XmlDocument)
Dim entryElements As XmlNodeList = response.GetElementsByTagName("entry")
For i As Integer = 0 To entryElements.Count - 1
Dim element As XmlElement = CType(entryElements(i), XmlElement)
Dim contentElement As XmlElement = CType(element.GetElementsByTagName("content")(0), XmlElement)
Dim propElement As XmlElement = CType(contentElement.GetElementsByTagName("m:properties")(0), XmlElement)
Dim nameElement As XmlNode = propElement.GetElementsByTagName("d:Name")(0)
If nameElement Is Nothing Then
Throw New Exception("Name not found")
End If
Dim latElement As XmlNode = propElement.GetElementsByTagName("d:Latitude")(0)
If latElement Is Nothing Then
Throw New Exception("Latitude not found")
End If
Dim longElement As XmlNode = propElement.GetElementsByTagName("d:Longitude")(0)
If longElement Is Nothing Then
Throw New Exception("Longitude not found")
End If
Dim name As String = nameElement.InnerText
Dim latitude As Double = 0
Double.TryParse(latElement.InnerText, latitude)
Dim longitude As Double = 0
Double.TryParse(longElement.InnerText, longitude)
Console.WriteLine("Coordinates of '{0}': {1}, {2}", name, latitude, longitude)
Next i
End Sub
#End Region
#Region "Query by Property"
Public Sub ExampleFindByProperty()
Console.WriteLine(vbLf & "ExampleFindByProperty")
' Find all previously uploaded MyShops entities that accept
' online orders.
' Custom name of spatial data source created during upload
Dim dataSourceName As String = "FourthCoffeeSample"
' Name of entities in the data source
Dim dataEntityName As String = "FourthCoffeeShops"
' Unique access ID assigned to your data source by Bing Maps
' e.g. f8986xxxxxxxc844b
Dim accessId As String = DataSourceID
' Your Bing Maps Spatial Data Services query key.
Dim bingMapsKey As String = MyKey
' Setup REST request to query our uploaded customer data
Dim requestUrl As String = String.Format("http://spatial.virtualearth.net/REST/v1/data/{0}/{1}/{2}" & "?$filter=AcceptsOnlineOrders Eq True&key={3}", accessId, dataSourceName, dataEntityName, MyKey)
' Send the request and get back an XML response.
Dim response As XmlDocument = GetXmlResponse(requestUrl)
' Display each entity's info.
ProcessEntityElements(response)
End Sub
#End Region
#Region "Query by Bounding Box"
Public Sub ExampleFindByBoundingBox()
Console.WriteLine(vbLf & "ExampleFindByBoundingBox")
' Find all previously uploaded MyShops entities located within
' the specified bounding box.
' Custom name of spatial data source created during upload
Dim dataSourceName As String = "FourthCoffeeSample"
' Name of entities in the data source
Dim dataEntityName As String = "FourthCoffeeShops"
' Unique access ID assigned to your data source by Bing Maps
' e.g. f8986xxxxxxxc844b
Dim accessId As String = DataSourceID
' Your Bing Maps Spatial Data Services query key.
Dim bingMapsKey As String = MyKey
' Coordinates of the bounding box's corners
Dim lat1 As Double = 47.612476759406583
Dim long1 As Double = -122.3237670214032
Dim lat2 As Double = 47.682391560800767
Dim long2 As Double = -122.27996173131822
' Setup REST request to query our uploaded customer data
Dim requestUrl As String = 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, MyKey)
' Send the request and get back an XML response.
Dim response As XmlDocument = GetXmlResponse(requestUrl)
' Display each entity's info.
ProcessEntityElements(response)
End Sub
#End Region
#Region "Query By ID"
''' <summary>
''' Query by ID using ATOM protocol
''' </summary>
Public Sub ExampleQueryByIdAtom()
Console.WriteLine(vbLf & "ExampleQueryByIdAtom")
' 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
Dim dataSourceName As String = "FourthCoffeeSample"
' Name of entities in the data source
Dim dataEntityName As String = "FourthCoffeeShops"
' Unique access ID assigned to your data source by Bing Maps
' e.g. f8986xxxxxxxc844b
Dim accessId As String = DataSourceID
' ID of the entity to search for
Dim entityId As Integer = -22067
' Your Bing Maps Spatial Data Services query key.
Dim bingMapsKey As String = MyKey
Dim requestUrl As String = String.Format("http://spatial.virtualearth.net" & "/REST/v1/data/{0}/{1}/{2}('{3}')?key={4}", accessId, dataSourceName, dataEntityName, entityId, MyKey)
' By default, the Spatial Data API returns
' data responses in Atom (xml) format.
Dim xmlResponse As XmlDocument = GetXmlResponse(requestUrl)
' Select the first shop data in the xml results.
Dim nsmgr As 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")
Dim firstShopNode As XmlNode = xmlResponse.SelectSingleNode("//a:entry/a:content/m:properties", nsmgr)
' Extract result data from the xml nodes.
Dim retrievedEntityId As Integer = Integer.Parse(firstShopNode.SelectSingleNode("d:EntityID", nsmgr).FirstChild.Value)
Dim postalCode As String = firstShopNode.SelectSingleNode("d:PostalCode", nsmgr).FirstChild.Value
Dim latitude As Double = Double.Parse(firstShopNode.SelectSingleNode("d:Latitude", nsmgr).FirstChild.Value)
Dim longitude As Double = 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))
End Sub
#End Region ';
End Class