I used the GPS Intermediate Driver to do this, and the code provided by the Windows Mobile 6 SDK.
The simplest code that can be written references the sample library provided by the SDK. My sub-80 line program to do this looks like this:
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.Samples.Location;
namespace MobileLocate
{
public partial class FormMain : Form
{
Gps gps = new Gps();
GpsDeviceState device = null;
GpsPosition position = null;
public FormMain()
{
InitializeComponent();
// updates from GPS need to be delgate to the UI thread
EventHandler uiUpdatesOnApplicationThread = new EventHandler(UpdateUI);
// handle device state updates
gps.DeviceStateChanged += new DeviceStateChangedEventHandler(delegate(object sender, DeviceStateChangedEventArgs args)
{
device = args.DeviceState;
Invoke(uiUpdatesOnApplicationThread);
});
// handle location updates
gps.LocationChanged += new LocationChangedEventHandler(delegate(object sender, LocationChangedEventArgs args)
{
position = args.Position;
Invoke(uiUpdatesOnApplicationThread);
});
gps.Open();
}
void UpdateUI(object sender, System.EventArgs args)
{
if (device != null)
textBoxDev.Text = device.FriendlyName + " " + device.ServiceState + ", " + device.DeviceState;
if (position != null)
{
if (position.LatitudeValid && position.LongitudeValid)
textBoxLocation.Text = String.Format("{0}, {1}", position.Latitude, position.Longitude);
if (position.SatellitesInSolutionValid &&
position.SatellitesInViewValid &&
position.SatelliteCountValid)
{
textBoxSats.Text = "Satellite Count:\n " + position.GetSatellitesInSolution().Length + "/" +
position.GetSatellitesInView().Length + " (" +
position.SatelliteCount + ")\n";
}
}
}
private void FormMain_Closed(object sender, EventArgs e)
{
// ensures application closes cleanly
if (gps.Opened)
gps.Close();
}
}
}
I ran this just now, and stuck the co-ordinates into a map - and it works a treat!
I plan to extend this code to allow it to report into a central server (with a username/password) and then be able to show this on the map. This will form one of the overlays (more later on this) that can be incorporated onto a map - this means you could chose to have the location of a set of users appear on a map (they will have to be permissions on this, and maybe a "how precise" feature to mask exact location)
From the mobile viewpoint, it should be easy enough to use the vector maps to show a local map on the mobile phone as well. For the moment I may just add the ability for the system to tell you where you are (for example postcode in the UK using http://www.freethepostcode.org/ data), or just the nearest city or pub! ;-)
No comments:
Post a Comment