Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / WPF

Sample WPF Application Consuming Bing Maps Web Services

3.00/5 (5 votes)
13 May 2010CPOL4 min read 96.9K   5K  
Here is a sample WPF application that consumes GeocodeService, SearchService, ImageryService and RouteService that are part of Bing Maps web service

Introduction

This article demos a sample WPF application that consumes Bing Maps web service that comes handy if your business requirements indicate that you need to build a desktop application. This article demonstrates using the Geocode, Imagery, Route, and Search services of the Bing Maps Web Services in a desktop application, using Windows Presentation Foundation (WPF) and C#.

Background

Ever wish to have bing maps integrated with your Windows application? Here is the solution. All you need is Visual Studio 2008, .NET Framework 3.0 and Bing Maps Platform Developer Account credentials. You can sign up for a free developer account at the Bing Maps Account Center. The Bing Maps Web Services require that you have a Bing maps key to make requests. You can create a key when you sign into your account at Bing Maps Account Center. For more information about creating a key, see Accessing the Bing Maps Web Services.

Using the Code

Once you have your Bing Maps Account and the key, you are ready to start creating proxy classes that reference the Bing Maps Web Services. To do this, you need to set up service references which provide the geocoding, mapping and search features. These are added as Windows Communication Foundation (WCF) services and Visual Studio builds proxy files for the project.

NamespaceAddress
GeocodeService http://dev.virtualearth.net/webservices/v1/geocodeservice/
geocodeservice.svc?wsdl
SearchServicehttp://dev.virtualearth.net/webservices/v1/searchservice/
searchservice.svc?wsdl
ImageryService http://dev.virtualearth.net/webservices/v1/imageryservice/
imageryservice.svc?wsdl
RouteServicehttp://dev.virtualearth.net/webservices/v1/routeservice/
routeservice.svc?wsdl

The code is simple. The first thing you have to do before calling any method of these services is to set the key that you got from your bing maps account. Once done, you create an instance of service that you want to use and try to identify the method that you want to invoke. Generally the methods need object of some type to be passed as its param, so spend some time understanding the param and what properties need to be set.

You will notice that the app has 6 buttons. Here is what each button does:

1. GeoCode

This button converts a postal address into geo code (longitudes and latitudes). This feature is based on Geocode Service. The Geocode Service offers methods to geocode addresses and reverse geocode locations.

Here is the code that explains how to get the geo code for the specified address. It is very simple. First, start by setting the key that you got from your bing maps account as the credential for GeocodeRequest. Next, set the filters. Once done, create the instance of GeoServiceClient and fire its GeoCode method.

C#
private GeocodeResponse GeocodeAddressGeocodeResponse(string address)
{
    GeocodeRequest geocodeRequest = new GeocodeRequest()

    // Set the credentials using a valid Bing Maps key
    geocodeRequest.Credentials = new GeocodeService.Credentials();
    geocodeRequest.Credentials.ApplicationId = key;

    // Set the full address query
    geocodeRequest.Query = address;

    // Set the options to only return high confidence results 
    ConfidenceFilter[] filters = new ConfidenceFilter[1];
    filters[0] = new ConfidenceFilter();
    filters[0].MinimumConfidence = GeocodeService.Confidence.High;

    // Add the filters to the options
    GeocodeOptions geocodeOptions = new GeocodeOptions();
    geocodeOptions.Filters = filters;
    geocodeRequest.Options = geocodeOptions;

    // Make the geocode request
    GeocodeServiceClient geocodeService = new GeocodeServiceClient();
    GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

    return geocodeResponse;
}        

Here is a screen shot:

1.png

2. Reverse GeoCode

As the name suggests, you can convert the geo code into readable postal address. It is quite similar to Get GeoCode method explained above.

3. Search

This method takes the "what" and "where" part of the query. "What" is things like gas stations, barber, etc. and "where" is the location. It returns a list of search results. The app shows the name and distance, but you could do more with the data received.

Here is the code snippet that gets the search results near the location specified.

C#
private string SearchKeywordLocation(string keywordLocation)
{
String results = "";
SearchRequest searchRequest = new SearchRequest();

// Set the credentials using a valid Bing Maps key
searchRequest.Credentials = new SearchService.Credentials();
searchRequest.Credentials.ApplicationId = key;

//Create the search query
StructuredSearchQuery ssQuery = new StructuredSearchQuery();
string[] parts = keywordLocation.Split(';');
ssQuery.Keyword = parts[0];
ssQuery.Location = parts[1];
searchRequest.StructuredQuery = ssQuery;

//Define options on the search
searchRequest.SearchOptions = new SearchOptions();
searchRequest.SearchOptions.Filters =
            new FilterExpression()
            {
            PropertyId = 3,
            CompareOperator = CompareOperator.GreaterThanOrEquals,
            FilterValue = 8.16
            };

//Make the search request 
SearchServiceClient searchService = new SearchServiceClient();
SearchResponse searchResponse = searchService.Search(searchRequest);

//Parse and format results
if (searchResponse.ResultSets[0].Results.Length > 0)
{

    StringBuilder resultList = new StringBuilder("");
    for (int i = 0; i < searchResponse.ResultSets[0].Results.Length; i++)
    {
        resultList.Append(String.Format("{0}. {1}, 
		[Dist]{2}, [Loc]{3}, [Id]{4}\n", i + 1,
        searchResponse.ResultSets[0].Results[i].Name, 
        searchResponse.ResultSets[0].Results[i].Distance, 
        searchResponse.ResultSets[0].Results[i].LocationData,
        searchResponse.ResultSets[0].Results[i].Id));
    }
    results = resultList.ToString();
}
else
    results = "No results found";

return results;
}

Here is the snap shot:

3.png

4. MapIt (L&L)

This method receives geo code and shows the map of that area. See #5 point below for more details.

5. MapIt

This method receives the English like address and shows the map. You will also see a scroll bar that you could use to set the zoom level.

Here is the code snippet. It is quite simple. You create an instance of Imagery Service and fire its GetMapUri method. This method will take object of MapUriRequests. This is the object where you get the longitude and latitude and the zoom level.

C#
private string GetImagery(string locationString, int zoom)
{
    MapUriRequest mapUriRequest = new MapUriRequest();

    // Set credentials using a valid Bing Maps key
    mapUriRequest.Credentials = new ImageryService.Credentials();
    mapUriRequest.Credentials.ApplicationId = key;

    // Set the location of the requested image
    mapUriRequest.Center = new ImageryService.Location();
    string[] digits = locationString.Split(',');
    mapUriRequest.Center.Latitude = double.Parse(digits[0].Trim());
    mapUriRequest.Center.Longitude = double.Parse(digits[1].Trim());

    // Set the map style and zoom level
    MapUriOptions mapUriOptions = new MapUriOptions();
    mapUriOptions.Style = MapStyle.AerialWithLabels;
    mapUriOptions.ZoomLevel = zoom;

    // Set the size of the requested image in pixels
    mapUriOptions.ImageSize = new ImageryService.SizeOfint();
    mapUriOptions.ImageSize.Height = 200;
    mapUriOptions.ImageSize.Width = 300;
    mapUriRequest.Options = mapUriOptions;

    //Make the request and return the URI
    ImageryServiceClient imageryService = new ImageryServiceClient();
    MapUriResponse mapUriResponse = imageryService.GetMapUri(mapUriRequest);
    return mapUriResponse.Uri;
}

Here is the snap shot:

5.png

6. Route

This method takes two addresses and returns the route between these two end points. The Route Service can calculate a route between waypoints. As with the other services, you need to start by creating a request object. A RouteRequest object includes the array of waypoints to route between and options on how to calculate the route. The result object contains a set of step by step instructions.

In order to get the route, you will need to use RouteService. This service needs an instance of WayPoint where you set the coordinates of start and end address. Once you are done populating the WayPoint object, just call RouteService.CalculateRoute method. Here is the code snippet:

C#
//Parse user data to create array of waypoints
string[] points = new string[]{start, end};
Waypoint[] waypoints = new Waypoint[points.Length];
int pointIndex = -1;

foreach (string point in points)
{
	pointIndex++;
	waypoints[pointIndex] = new Waypoint();
	string[] digits = point.Split(','); 
	waypoints[pointIndex].Location = new RouteService.Location();
	waypoints[pointIndex].Location.Latitude = double.Parse(digits[0].Trim());	
	waypoints[pointIndex].Location.Longitude = double.Parse(digits[1].Trim());

	if (pointIndex == 0)
		waypoints[pointIndex].Description = "Start";
	else if (pointIndex == points.Length)
		waypoints[pointIndex].Description = "End"
	else
		waypoints[pointIndex].Description = 
			string.Format("Stop #{0}", pointIndex);
}
routeRequest.Waypoints = waypoints;

// Make the calculate route request
RouteServiceClient routeService = new RouteServiceClient();
RouteResponse routeResponse = routeService.CalculateRoute(routeRequest);  

Here is the snap shot:

6.png

Points of Interest

Now you know how to consume Bing Maps web Geocode, Imagery, Route, and Search services. Feel free to play with the code and dig deeper. Have fun!

History

  • 13th May, 2010: Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)