Using ReverseGeocodeQuery for Windows Phone 8
So, I started writing some of my apps I had for Android and WP7 for Windows Phone 8 and to my surprise Nokia Maps are looking to be a really good thing. With the New Nokia Maps, there are Maps services that come with the Windows Phone 8 SDK. One in particular is ReverseGeocodeQuery. This is great as I can use my internal map to get geocoding without having to reference any of the Bing Services. Now, if you want more of the Bing services like Search, Live API, ect. then BIng Services API is the way to go. For my example I will show you how to use the ReverseGeocodeQuery and fill in a textblock with a address of where I am.
Building the Sample Phone Project in Visual Studio 2012
First thing you want to do is open Visual Studio 2012 and create a new windows phone project. We are going to name it "ReverseGeocodeQueryPhoneApp" and you will want to pick Windows Phone 8.0 SDK.
Next, you should see Visual Studio creating your project and you should see below.
Now, with the MainPage.xaml open, add in the code below to the main content grid.
<TextBlock x:Name="CurrentLocTextBlock" HorizontalAlignment="Left"
Foreground="{StaticResource PhoneForegroundBrush}"
FontSize="20" FontWeight="Bold"/>
Open the code behind and Add in the reference code below.
public partial class MainPage : PhoneApplicationPage
{
// Progress indicator shown in system tray
private ProgressIndicator ProgressIndicator = null;
// My current location
private GeoCoordinate MyCoordinate = null;
// Reverse geocode query
private ReverseGeocodeQuery MyReverseGeocodeQuery = null;
/// <summary>
/// Accuracy of my current location in meters;
/// </summary>
private double _accuracy = 0.0;
// Constructor
public MainPage()
{
InitializeComponent();
GetCurrentCoordinate();
}
/// <summary>
/// Method to get current coordinate asynchronously so that the UI thread is not blocked. Updates MyCoordinate.
/// Using Location API requires ID_CAP_LOCATION capability to be included in the Application manifest file.
/// </summary>
private async void GetCurrentCoordinate()
{
Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracy = PositionAccuracy.High;
try
{
Geoposition currentPosition = await geolocator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(10));
_accuracy = currentPosition.Coordinate.Accuracy;
MyCoordinate = new GeoCoordinate(currentPosition.Coordinate.Latitude, currentPosition.Coordinate.Longitude);
if (MyReverseGeocodeQuery == null || !MyReverseGeocodeQuery.IsBusy)
{
MyReverseGeocodeQuery = new ReverseGeocodeQuery();
MyReverseGeocodeQuery.GeoCoordinate = new GeoCoordinate(MyCoordinate.Latitude, MyCoordinate.Longitude);
MyReverseGeocodeQuery.QueryCompleted += ReverseGeocodeQuery_QueryCompleted;
MyReverseGeocodeQuery.QueryAsync();
}
}
catch (Exception ex)
{
...
}
}
/// <summary>
/// Event handler for reverse geocode query.
/// </summary>
/// <param name="e">Results of the reverse geocode query - list of locations</param>
private void ReverseGeocodeQuery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e)
{
if (e.Error == null)
{
if (e.Result.Count > 0)
{
MapAddress address = e.Result[0].Information.Address;
CurrentLocTextBlock.Text = "Current Location: " + address.City + ", " + address.State;
}
}
}
}
Remember to check ID_CAP_Location and ID_CAP_Map in the Capabilities section of the Windows Manifest. if you don't you will get a Access Denied Error.
Now you are set to debug your work, below is what should be displaying in the emulator.
I hope you found the post useful. As I come across more great things in Windows Phone 8 development (I am sure I will). I will pass it along to you all.
Happy Coding!!
Thanks,
John
Comments
Anonymous
December 06, 2012
Thank you very much. It was interesting to learn this. KRKAnonymous
December 25, 2012
Need your help。 I get the address only “china”, I can't get the city "shanghai", why?Anonymous
December 25, 2012
The comment has been removedAnonymous
December 26, 2012
As part of ReverseGeocodeQuery_QueryCompleted, the QueryCompletedEventArgs<IList<MapLocation>> brings back a list of possible locations. You can loop through the list to find the best possible address. MapAddress address = e.Result[0].Information should give you all the possible data elements you need to bring back all address elements. Try reading: msdn.microsoft.com/.../microsoft.phone.maps.services.mapaddress(v=vs.105).aspx Thanks, JohnAnonymous
December 26, 2012
The comment has been removedAnonymous
January 30, 2013
Thanks. Useful.Anonymous
March 19, 2013
Hi John, There is no response in text block. I have done all the things you said. Thanks, Mohamed Samsudeen K SAnonymous
April 05, 2013
what should i do if i want to update the position information whenever the user makes a move to a different location????Anonymous
May 07, 2013
Mohamed Samsudeen I had the same problem. After I added a height and width to the textblock, I could see the location information. DavidAnonymous
January 23, 2014
The comment has been removedAnonymous
March 13, 2014
void reverseGeocode_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e) { if (e.Error == null) { if (e.Result.Count > 0) { MessageBox.Show("This works"); MapAddress address = e.Result[0].Information.Address; CurrentLocTextBlock.Text = "Current Location: " + address.City + ", " + address.State; txtAdd.Text = address.City; } else { MessageBox.Show("e.Result.Count < 0."); } } else { MessageBox.Show("e.Error != null"); } } why this code control always goes to MessageBox.Show("e.Result.Count < 0.");Anonymous
March 23, 2014
Thank u so much john.Anonymous
July 14, 2014
The comment has been removedAnonymous
July 28, 2014
Hi Pinocchio Its permission based issue. Enable both "ID_CAP_MAP" and "ID_CAP_LOCATION" capabilities in WMAppManifest file.Anonymous
August 11, 2014
Thank you, this was really useful.