【IT168技术文档】
前几天,有朋友托我给他写个GPS程序,就取经纬度坐标,以及将之转换成高斯直角坐标。花了一些时间,给他做了个小程序。
后来总结时,想起,很多网上朋友都会问及关于GPS开发的一些事。我这里先将我的程序解释下,然后再总结下,相关经验及个人看法。
目前在一些移动设备中,都提供GPS功能,设备中都需要一个接收器,用来接收GPS信号。(类似于GPRS工作方式)。GPS一旦启动后,会自动连接卫星,接收信号,通过算法计算出位置等信息,然后以NMEA data的格式输出。GPS receiver就是接收卫星信号转换成NMEA data的设备。
开发GPS有3种选择:
1。直接使用串口连接GPS接收器
2。GPS Intermediate Driver
2。使用第三方类库(目前opennetcf提供相应类库)
目前,WM5.0以上系统,都内置了GPS Intermediate Driver。通过它,我们能够很方便的取道GPS数据。
关于GPS方面的文章可以参考:
1。30 Days of .NET [Windows Mobile Applications] - Day 03: GPS Compass(GPS指南针)
2。.NET Compact Framework下的GPS NMEA data数据分析
虽然GPS Intermediate Driver提供了我们非常快捷的取得GPS信息,但同时也有一定的弊端。
那下面我讲介绍我如何在该项目中使用GPS的。
我使用GPS Intermediate Driver,它能够快速开发,MS也提供了很强大的例子来方便我们使用。
在微软的WM SDK安装目录下有GPS工程。(Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS)
该Demo中
GPS.cs:封装了GPS的操作类,比如Open(),Close(),Connect()。可以很快捷的使用。
GpsDeviceState.cs:用于取得目前GPS设备的状态信息。
GpsPosition.cs:每次GPS数据取得后,都会放入该类。
LocationChangedEventArgs.cs:一旦位置改变,即可将新的GPSPosition取得到。
public void Open()
{
if (!Opened)
{
// create handles for GPS events
newLocationHandle = CreateEvent(IntPtr.Zero, 0, 0, null);
deviceStateChangedHandle = CreateEvent(IntPtr.Zero, 0, 0, null);
stopHandle = CreateEvent(IntPtr.Zero, 0, 0, null);
gpsHandle = GPSOpenDevice(newLocationHandle, deviceStateChangedHandle, null, 0);
// if events were hooked up before the device was opened, we'll need
// to create the gps event thread.
if (locationChanged != null || deviceStateChanged != null)
{
CreateGpsEventThread();
}
}
}
通过调用CreateEvent,创建handles,然后调用GPSOpenDevice API,将handle传入,取到gps设备的handle
得到handle后,再创建一个线程来监听GPS数据及设备状态。通过调用CreateGpsEventThread方法。
private void CreateGpsEventThread()
{
// we only want to create the thread if we don't have one created already
// and we have opened the gps device
if (gpsEventThread == null && gpsHandle != IntPtr.Zero)
{
// Create and start thread to listen for GPS events
gpsEventThread = new System.Threading.Thread(new System.Threading.ThreadStart(WaitForGpsEvents));
gpsEventThread.Start();
}
}
在WaitForGpsEvents方法中,就while不听的监听。
当deviceStateChanged,就调用deviceStateChanged事件,然后取得当前设备状态。
当locationChanged,就调用locationChanged事件,取得当前坐标。
这样一个基本的GPS数据取得流程就算完成了。