艾伟:WM--GPS开发

  前几天,有朋友托我给他写个GPS程序,就取经纬度坐标,以及将之转换成高斯直角坐标。花了一些时间,给他做了个小程序。

  后来总结时,想起,很多网上朋友都会问及关于GPS开发的一些事。我这里先将我的程序解释下,然后再总结下,相关经验及个人看法。

  目前在一些移动设备中,都提供GPS功能,设备中都需要一个接收器,用来接收GPS信号。(类似于GPRS工作方式)。GPS一旦启动后,会自动连接卫星,接收信号,通过算法计算出位置等信息,然后以NMEA data的格式输出。GPS receiver就是接收卫星信号转换成NMEA data的设备。

  开发GPS有3种选择:
  1、直接使用串口连接GPS接收器
  2、GPS Intermediate Driver
  3、使用第三方类库(目前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, deviceStateChangedHan
dle, 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数据取得流程就算完成了。

以下为调用API的函数声明。

Code
[DllImport("gpsapi.dll")]
static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, int dwFlags);

[DllImport("gpsapi.dll")]
static extern int  GPSCloseDevice(IntPtr hGPSDevice);

[DllImport("gpsapi.dll")]
static extern int  GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, int dwMaximumAge, int dwFlags);

[DllImport("gpsapi.dll")]
static extern int  GPSGetDeviceState(IntPtr pGPSDevice);

[DllImport("coredll.dll")]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, int bManualReset, int bInitialState, StringBuilder lpName);

[DllImport("coredll.dll")]
static extern int CloseHandle(IntPtr hObject);

const int waitFailed = -1;
[DllImport("coredll.dll")]
static extern int WaitForMultipleObjects(int nCount, IntPtr lpHandles, int fWaitAll, int dwMilliseconds);

const int eventSet = 3;
[DllImport("coredll.dll")]
static extern int EventModify(IntPtr hHandle, int dwFunc);

  有时候,我们往往不需要简单的GPS的经纬度,我们或许需要更多的数据。这时候就需要转换。
比如,在我这个应用中,需要取得对应的高斯直角坐标。

  当然我们需要通过一系列的数学运算得到。
  我们需要设置一个重要子午线的坐标,然后根据该坐标计算得到。

public static void ConvertBLToXY(double bl1, double bl2, ref double x, ref double y)
{
    if (enableBLToXY)
    {
        try
        {
            //a2 输入中央子午线,以度.分形式输入,如115度30分则输入115.30; 起算数据l0 
            //f2 以度小数形式输入经度值, l 
            //e2 以度小数形式输入纬度值,b 
            //s2 计算结果,横坐标y 
            //t2 计算结果,纵坐标x 
            //投影带号计算 n=[l/6]+1 如:测得经度103.xxxx,故n=[103.x/6]+1=17+1=18 
            //中央经线经度 l0 = n*6-3 = [l/6]*6+3 
            double a2, f2, e2, s2, t2;
            a2 = centerLine;
            f2 = bl1;
            e2 = bl2;
            e2 = x;
            t2 = y;
            double b2, h2, i2, j2, k2, l2, m2, n2, o2, p2, q2, r2;

            b2 = (int)(a2) + ((int)(a2 * 100) - (int)(a2) * 100) / 60 + (a2 * 10000 -
(int)(a2 * 100) * 100) / 3600;
            //把l0化成度(a2) 
            //g2 = f2 - b2 ' l -l0 
            //h2 = g2 / 57.2957795130823 '化作弧度
            //将经差的单位化为弧度
            h2 = (f2 - b2) / 57.2957795130823;
            i2 = Math.Tan(e2 / 57.2957795130823);
            j2 = Math.Cos(e2 / 57.2957795130823);
            k2 = 0.006738525415 * j2 * j2;
            l2 = i2 * i2;
            m2 = 1 + k2;
            n2 = 6399698.9018 / Math.Sqrt(m2);
            o2 = h2 * h2 * j2 * j2;
            p2 = i2 * j2;
            q2 = p2 * p2;
            r2 = (32005.78006 + q2 * (133.92133 + q2 * 0.7031));
            s2 = ((((l2 - 18) * l2 - (58 * l2 - 14) * k2 + 5) * o2 / 20 + m2 - l2) *
o2 / 6 + 1) * n2 * (h2 * j2);
            //在计算的基础上加上了“带号”(18)和“东移”(500km) 
            s2 = s2 + 18500000;
            //计算结果,横坐标y 
            t2 = 6367558.49686 * e2 / 57.29577951308 - p2 * j2 * r2 + ((((l2 - 58)
 * l2 + 61) * o2 / 30 + (4 * k2 + 5) * m2 - l2) * o2 / 12 + 1) * n2 * i2 * o2 / 2;
            //计算结果,纵坐标x 

            x = s2;
            y = t2;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            x = 0;
            y = 0;
        }
    }
}

 

  以上就是我的GPS应用程序的主体代码介绍。希望对大家有用。

  可能根据每个项目的实际状况不一致,我的个人意见如下:
  1、项目中GPS部分取得的数据简单的话,可以直接采用GPS Intermediate Driver
  2、最好自己封装下直接使用串口连接GPS接收器的功能。
  3、地图定位,可以借助Google。
  4、注意释放内存,因为多数都需要调用非托管
  5、一定要用线程处理。

  最后,附上应用程序CAB包。很多人写打包程序觉得有时候有困难,其实,一个简单的打包CAB程序相对很简单。现在很多WM设备,基本稳妥地还是用基于.net cf2.0为主。所以大家工程发布最好还是以.net cf2.0吧,因为有些设备安装.net cf3.5不稳定导致。

时间: 2024-10-26 18:04:30

艾伟:WM--GPS开发的相关文章

wince&mobile的GPS开发

1.获取GPS数据的两种方式: 一.直接访问GPS关联的串口,读取串口数据. 像访问普通串口设备一样,调用 CreateFile等一系列相关API,但是要事先知道GPS硬件所关联的串口设备.. 二.使用系统API. Function Description GPSCloseDevice Closes the connection to the GPS Intermediate Driver. GPSGetDeviceState Retrieves information about the cu

WM--GPS开发

前几天,有朋友托我给他写个GPS程序,就取经纬度坐标,以及将之转换成高斯直角坐标.花了一些时间,给他做了个小程序. 后来总结时,想起,很多网上朋友都会问及关于GPS开发的一些事.我这里先将我的程序解释下,然后再总结下,相关经验及个人看法. 目前在一些移动设备中,都提供GPS功能,设备中都需要一个接收器,用来接收GPS信号.(类似于GPRS工作方式).GPS一旦启动后,会自动连接卫星,接收信号,通过算法计算出位置等信息,然后以NMEA data的格式输出.GPS receiver就是接收卫星信号转

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │   ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │    

北斗导航:总体性能与GPS相当 拥有“独门绝技”

新华网北京12月27日电(余晓洁 朱基钗)"截至目前,北斗系统在中国和周边地区已经可以独立地提供卫星导航定位授时服务,总体性能与美国GPS性能相当." 北斗卫星导航系统http://www.aliyun.com/zixun/aggregation/38628.html">新闻发言人冉承其27日在国务院新闻办举行的新闻发布会上宣布,北斗卫星导航系统今起向亚太大部分地区正式提供区域服务. 众所周知,在全球卫星导航市场中,美国的GPS开发早,占领了绝大部分市场份额.这对&qu

WinCE下的GPS设备操作

通常,GPS接收机被设计成为标准串口设备,不管是CF接口还是蓝牙接口,都被映射成为串口设备,因此,在程序员的眼中,只需如同一般的串口设备来对待即可(对于蓝牙GPS,当然我们也可以通过蓝牙API,在程序中完成设备搜索.映射工作,而减少用户手工处理的麻烦).借助前一篇文章"WinCE下的串口操作"提供的串口类库,我们可以很方便的建立一个GPS类库,但在这个工作之前,我们还是简单的看一下GPS设备的工作过程:GPS是美国提供的一套基于卫星的全球定位系统,它由天空中运行着的24颗卫星组建的星座

物联网时代 企业需要什么样的人才?

物联网(IoT)技术的大爆发时代即将到来,世界将进入真正的万物互联.据记者了解,某科技公司高管明确表示,现在与客户所谈的项目全部是关于物联网.可以预见,未来对物联网人才的需求将激增. 根据Gartner的研究,事实上,希望从IoT中寻求效益的企业大多数面连着人才不足和专业知识缺乏的障碍. 全球自由市场Upwork根据基于年度工作岗位增长和技能需求的相关数据库数据,认为企业在推动成功的物联网战略时,需要以下这些技能和相关人才. 机器学习 机器学习算法通过使用数据传感器和其他连接的设备来帮助创建更智

ERP下的物流管理

ERP下的物流管理 经济的全球化,企业面对前所未有的竞争市场,企业应怎样赢得未来市场.根据当前国内物流现状,本文详细论述企业ERP(Enterprise Resources Planning)下的物流管理的意义,面临的问题,并提出利用当今先进的管理理念,集成最前沿的技术如GIS(Geographical Information System)/GPS(Geographical Position System).信息搜索学,装备现代化设备等,来改善和优化现在企业的物流管理. ERP下的物流概述 新

手机跨平台方案介“.NET研究”绍

引述 现在手机平台种类繁多,主流平台有Symbian.IOS.Android.WM6.5.WP7以及中国山寨机所普遍使用的MTK,展讯, MSTAR. 作为开发者来说,特别是学生,要做一款软件支持如上平台,实在是一件遥不可及的事情. 不同种类的应用,成功的条件是不同的.有些应用是以质取胜的,有些应用则在质的同时必须要有足够的用户群(如LBS应用相关),也就是量的优势.因此,不同应用对于多平台支持的需求是有差异的,这也是本文探讨如何跨平台开发的价值所在. 跨平台开发有许多种方式,在文献中可查到有下

手机跨平台方案介绍

引述 现在手机平台种类繁多,主流平台有Symbian.IOS.Android.WM6.5.WP7以及中国山寨机所普遍使用的MTK,展讯, MSTAR. 作为开发者来说,特别是学生,要做一款软件支持如上平台,实在是一件遥不可及的事情. 不同种类的应用,成功的条件是不同的.有些应用是以质取胜的,有些应用则在质的同时必须要有足够的用户群(如LBS应用相关),也就是量的优势.因此,不同应用对于多平台支持的需求是有差异的,这也是本文探讨如何跨平台开发的价值所在. 跨平台开发有许多种方式,在文献中可查到有下