Logo
Windows XP
Windows Vista
Windows 7
Windows Azure
Windows Server
Windows Phone
EPL Standings
 
 
Windows Phone

Windows Phone 7 : Sensors - Indicating the User's Position?

- 2015 Chevrolet Camaro Z28 - The Legend Returns
- Wagon Audi Allroad Vs. Subaru Outback
- 996 Carrera 4S is Driving Perfection
8/13/2011 5:01:39 PM

1. Problem

You want an application (or game) that gives information about the area where your user is located. (For a game, you could choose to let the user play in the city where the user is located, against other players around there.)

2. Solution

To solve this problem, you'll use a control that uses Bing Maps tailored for WP7., but much more important of how you will show data, is how you will get them, thanks to the GeoCoordinateWatcher class contained in the namespace System.Device.Location.

3. How It Works

The GeoCoordinateWatcher class provides location data based on coordinates of latitude and longitude. Like other sensors, the cycle is defined by the Start method (which enables you to access to the Position property and enable the PositionChanged event) and Stop (which prevents GeoCoordinateWatcher from providing events and data on the position).

4. The Code

As you can see in Figure 1, the constructor has an overload that enables you to specify the degree of accuracy that you want in determining the user's location (the property DesiredAccuracy is read-only). If you set the accuracy to High, you will have a more precise location of the user, but this requires more resources that will easily discharge the battery. Therefore, use this setting only if needed, because you don't want to risk the user rejecting your application because it is too resource-intensive.

Figure 1. Class diagram of GeoCoordinateWatcher

There are two important events that you must take into consideration:

  • PositionChanged

  • StatusChanged

...

Then we start to see the private method that initialize the GeoCoordinateWatcher and subscribes the two events with our handlers

private void InitWatcher()
{
geoWatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
geoWatcher.PositionChanged += new
EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged);

geoWatcher.StatusChanged += new
EventHandler<GeoPositionStatusChangedEventArgs>(geoWatcher_StatusChanged);
}
...


The respective handler is as follows:

...
void geoWatcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
//Handle here the change of status
}

void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
//Handle here the change of position
}
...


Let us explain the purpose of these thow event-handlers:

  • geoWatcher_StatusChanged takes care of notifying that the status of GeoCoordinateWatcher has changed.

  • geoWatcher_PositionChanged is the most important. The event handler is called when the PositionChanged event occurs, and communicates via GeoCoordinate the new location.

The GeoCoordinate class has several interesting fields that provide important information as you can see in figure 2, such as altitude, latitude, and longitude (identifying the position) that will be set to NAN until the Watcher status will not become ready. Another interesting property is the speed (which would be useful if you wanted to create a navigation system).

All you need to do to resolve your problem quickly is to write this code:

...
void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
//BingMap is the Map control provided for the scope
//14d is the level of zoom, this is good enough to have
bingMap.SetView(e.Position.Location,14d);
}


It's really too simple, we know. Microsoft loves to allow developers to create applications as quickly as possible and has therefore integrated into its operating system some base components to help developers focus on creating other aspects of their applications. Of course we think it's important that you know that the use of Bing Maps implies that you are registered on Bing Maps service portal.

Figure 2. Classes used to handle GeoCoordinate

What if you don't want to use Bing Maps to show the user's position on a map? You can use Microsoft Research Maps (available at http://msrmaps.com/default.aspx). In this article, you will not see how to interact with this service. Instead, your focus will be directed to the data, both at how to get it from Location Services, and at how to use it to find the user's exact spot.

After you add a reference to the service available from http://msrmaps.com/TerraService2.asmx (we will explain the configuration later), you can begin to look at the code.

The structure of the UI will look like this:

<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Location Service"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="LocationStatusTextBox" Text="..."
Style="{StaticResource PhoneTextNormalStyle}"/>
</StackPanel>
</StackPanel>

<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" >

</Grid>
</Grid>


There's something obviously strange in this interface at first glance. The Grid ContentPanel is empty, but only because inside the code you will create a kind of mosaic. In the code-behind, you will need a series of using statements:

...
using System.Device.Location;
using System.Windows.Media.Imaging;
using System.IO;
...

You will also need a private method that enables you to initialize the various services. In addition, you will need a proxy (and this will be the name of the object that we will use to interact with service but we will not see here the use of web services) for TerraService and a GeoCoordinateWatcher:

TerraService proxy = null;
GeoCoordinateWatcher geoWatcher = null;

// Constructor
public MainPage()
{

InitializeComponent();
InizializeServices();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}

private void InizializeServices()
{
proxy = new TerraService();
geoWatcher = new GeoCoordinateWatcher();
}

In the event that fires when the page has finished loading, you will write the code to subscribe to events that are raised at the completion of an asynchronous request. This is because the service always works asynchronously, so you don't stop the UI too long while you wait for a response, and then your code will be notified that a request has been answered. This mode of operation is not new to anyone who has already worked with Silverlight on the web side. Once again, this makes us appreciate how easy it is for developers to recycle their skills between technologies based on the .NET technologies stack.

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
...
//Subscribe here webservice events
...
geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged);

geoWatcher.StatusChanged += new
EventHandler<GeoPositionStatusChangedEventArgs>(geoWatcher_StatusChanged);
//Start the geoWatcher
geoWatcher.Start();
}


When the StatusChanged event of GeoCoordinateWatcher fires, you will change the text of the text box destined for this use, so you can have onscreen feedback that the location service is effectively launched and operational:

void geoWatcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
this.LocationStatusTextBox.Text = e.Status.ToString();
}


The workflow of your application is as follows:

  • firing the event geoWatcher_PositionChanged will make a request by calling the method GetAreaFromPt in the proxy,

  • whether successful or unsuccessful, will fire proxy_GetAreaFromPtCompleted event,

  • which in the case of a correct answer will call the GetTile method of the proxy, with the consequent trigger of the event proxy _ GetTileCompleted.

Then we start from the first step, implementing geoWatcher_PositionChanged

void geoWatcher_PositionChanged(object sender,
GeoPositionChangedEventArgs<GeoCoordinate> e)
{
if (!e.Position.Location.IsUnknown)
{
proxy.GetAreaFromPt (
//the ActualPosition
new TerraService.LonLatPt()
{
Lat = e.Position.Location.Latitude,
Lon = e.Position.Location.Longitude
},
//the type of map
1,
//the scale of image received
TerraService.Scale.Scale2km,
(int)ContentPanel.ActualWidth,
(int)ContentPanel.ActualHeight);
}
}


The purpose of this recipe was to show you how the Location Service, based on a universal standard for localization, enables you to access (without too much trouble) information about the device's position in the world.

5. Usage

From Visual Studio 2010, press Ctrl+F5. Wait for the application to start on the phone and then wait that the position is available then look that the position on the map changes relating your actual position.

Top Search -----------------
- Windows Server 2008 R2 : Work with RAID Volumes - Understand RAID Levels & Implement RAID
- Windows Server 2008 R2 Administration : Managing Printers with the Print Management Console
- Configuring Email Settings in Windows Small Business Server 2011
- Windows Server 2008 R2 : Configuring Folder Security, Access, and Replication - Implement Permissions
- Monitoring Exchange Server 2010 : Monitoring Mail Flow
- Windows Server 2008 R2 :Task Scheduler
- Windows Server 2008 R2 : File Server Resource Manager
- Windows Server 2008 R2 : Installing DFS
- Exchange Server 2010 : Managing Anti-Spam and Antivirus Countermeasures
- Windows Server 2008 R2 : Configuring Folder Security, Access, and Replication - Share Folders
Other -----------------
 
 
Most view of day
- BizTalk 2010 Recipes : Deployment - Exporting Applications
- BizTalk 2010 Recipes : EDI Solutions - Creating and Configuring a Trading Partner
- Managing Windows Vista : Backing Up Your Files & Restoring Backed-Up Files
- SQL Server 2012 : Data Architecture (part 2) - Smart Database Design
- Windows Server 2008 : Administering Security in an Enterprise-Level Infrastructure
- Windows Phone 8 : Localizing Your Phone Application
- Leveraging Social Networking Tools in SharePoint 2010 : Mapping a SharePoint Profile Field to Active Directory
Top 10
- Windows Phone 8 : Configuring Basic Device Settings - Providing Feedback
- Windows Phone 8 : Configuring Basic Device Settings - About Your Phone
- Windows Phone 8 : Configuring Basic Device Settings - Find My Phone
- Windows Phone 8 : Configuring Basic Device Settings - Accessibility (part 2) - Enabling the Screen Magnifier, Using Speech for Phone Accessibility
- Windows Phone 8 : Configuring Basic Device Settings - Accessibility (part 1) - Adjusting the Text Size, Enabling High Contrast
- Microsoft Visio 2010 : Linking External Data to Shapes (part 6) - Using Link Data - Linking Data to Shapes Using Link Data
- Microsoft Visio 2010 : Linking External Data to Shapes (part 5) - Using Link Data - Preparing a Master for Link Data , Importing Data for Link Data
- Microsoft Visio 2010 : Linking External Data to Shapes (part 4) - Using the Database Wizard - Taking the Data-Linked Light Bulb Shape for a Spin
- Microsoft Visio 2010 : Linking External Data to Shapes (part 3) - Using the Database Wizard - Setting Up the Excel File as a Data Source
- Microsoft Visio 2010 : Linking External Data to Shapes (part 3) - Using the Database Wizard - Setting Up the Excel File as a Data Source
Windows XP
Windows Vista
Windows 7
Windows Azure
Windows Server
Windows Phone
2015 Camaro