Query API Sample Code (VB)
Note
Bing Maps Spatial Data Service Query API retirement
Bing Maps Spatial Data Service Query API is deprecated and will be retired. Free (Basic) account customers can continue to use Bing Maps Spatial Data Service Query API until June 30th, 2025. Enterprise account customers can continue to use Bing Maps Spatial Data Service Query API until June 30th, 2028. To avoid service disruptions, all implementations using Bing Maps Spatial Data Service Query API will need to be updated to use Azure Maps Search POI API (for public POI search) or an alternative solution (for custom POI search), by the retirement date that applies to your Bing Maps for Enterprise account type. For more information, see Migrate Bing Maps Data Source Management and Query API.
Azure Maps is Microsoft's next-generation maps and geospatial services for developers. Azure Maps has many of the same features as Bing Maps for Enterprise, and more. To get started with Azure Maps, create a free Azure subscription and an Azure Maps account. For more information about azure Maps, see Azure Maps Documentation. For migration guidance, see Bing Maps Migration Overview.
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