For a Windows Phone 7 app I’ve been playing with, one last element I wanted to include was a “directions” function. Basically, I just wanted to pop up a Bing Map with a start and end point and directions, much like you’d get if you went directly to the maps application on the phone and manually entered the start and end point.
The API for this is pretty straightforward, at least for WP7.1 (Mango).
Essentially, you create a BingMapsDirectionsTask, supply a start and end point and invoke Show.
Dim bmt = New BingMapsDirectionsTask() bmt.Start = New LabeledMapLocation(StartName, New GeoCoordinate) bmt.End = New LabeledMapLocation(EndName, New GeoCoordinate) bmt.Show()
The problem was that New GeoCoordinate element. For the BingMapsDirectionsTask, you have to supply two LabeledMapLocation objects, one for the start and one for the end point.
No big deal, but according to the docs, you need to supply a Name for the labeled location, and a coordinate (essentially, just a Lat/Lon). This means that if all you have is an address, supplying the lat/lon becomes an issue of geocoding, and as far as I can tell, there’s no built-in service on the phone to geocode addresses.
I was able to turn up several good examples of using the BingMapGeoCodeService online, and they all worked fine (once you go through the requisite step of obtaining an AppID from www.bingmapsportal.com).
But, in the process of making that work, I discovered something interesting.
When creating the LabeledMapLocation objects for the start and end points, if you supply an address for the name, and nothing for the GeoCoordinate, the BingMapsDirectionsTask will automatically geocode the address!
I’m not sure whether this is intentional behavior, as the available docs for BingMapsDirectionsTask are pretty sparse, and it could be that this won’t make it into the final 7.1 release.
But, it sure makes interacting with BingMaps for simple direction functionality ridiculously easy.
The final code, then, would look like this:
Dim bmt = New BingMapsDirectionsTask() bmt.Start = New LabeledMapLocation("12 Main St, Dallas, Tx 76011", Nothing) bmt.End = New LabeledMapLocation("500 Oak Lawn Ave, Dallas, Tx, 76011", Nothing) bmt.Show()
Granted, using the BingMapGeoCodeService, you’ll have a lot more flexibility, including the ability to specify the level of confidence at which to filter geocoding hits, and you can actually retrieve multiple hit values and present them to the user in whatever fashion you want.
Let me know how it works for you!