免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2841|回复: 3
收起左侧

[技术交流] 怎样写一个GPS应用程序——介绍

[复制链接]

341

主题

9017

铜板

120

好友

版主

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
5375

灌水勋章宣传勋章

发表于 2010-2-24 22:32 | 显示全部楼层 |阅读模式
需要什么样的GPS应用程序才能满足商业级的要求呢,像安装在车里的导航器一样?而且,GPS数据是怎么被解释,从而应用于实际工作中的呢?在这两部分里,我将和大家一起探讨这两个问题,并且给你编写商业级GPS应用程序必要的技巧,让专业的GPS设备能够更好的为你所用。
一句重要的语句
第一部分将探讨描述GPS原始数据的工作。实际上这个工作已经被国家舰船电子协会(下面简称NMEAwww.nmea.org)给简化了许多,该网站介绍了一个正广泛应用于GPS主流设备的工业标准。为了给广大的开发人员一个良好的开端,我选择使用的一些VS.NET的源代码来自我的“GPS.NET Global Position SDK”组件。(为了简短这些代码,我去掉了诸如多线程和错误处理的部分。)
NMEA数据通过一个“逗号分隔的语句”来传递,这个语句包含的信息都基于语句的第一个单词。这里有五十种以上类型的语句,不过真正的一个描述仅仅需要处理少量的采集数据。最终常用的NMEA语句是“推荐最小”语句,它以“$GPRMC.”开头。这里有个一例子:
中国3S吧 3s8.cn

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A
这条语句基本上包含了GPS应用程序所需的全部数据:纬度、经度、速度、方向、卫星时间、状态以及磁场变量。
第一步就是要写一个方法来解释NMEA数据,这个方法需要完成两件事:将每条语句分解为独立的单词,和检查首单词是否有效。清单 1-1 就是这个描述类的开始部分。
清单 1-1:一个NMEA描述的核心功能是将NMEA语句分解成单个的单词。
'**  Listing 1-1.  The core of an NMEA interpreter
'*******************************************************
Public Class NmeaInterpreter
  ' 处理来自GPS接收器的信息 中国3S吧 3s8.cn
  Public Function Parse(ByVal sentence As String) As Boolean
    ' 将语句分解为单词
    Dim Words() As String = GetWords(sentence)
    ' 通过匹配首单词来决定下一步的工作
    Select Case Words(0)
      Case "$GPRMC"      ' 一条“推荐最小”的语句被找到! 中国3S吧 3s8.cn
        ' 标示这条语句为可用
        Return True
      Case Else
        ' 标示这条语句为不可用
        Return False
    End Select
  End Function
专业的3S站 3s8.cn

  ' 将语句分解为单词
  Public Function GetWords(ByVal sentence As String) As String()
    Return sentence.Split(","c)
  End Function
End Class
接下来一步就是要分析提取出来的信息了,让我们从纬度和经度开始吧。纬度和经度存储格式为“DDD°MM’SS.S,”,其中D表示时(也可以叫 “度”),M表示分,S表示秒。坐标可以简单表示为“DD°MM.M’”或者直接就表示为“DD°.”语句中第四个单词(“3939.7,”)以度和分的形式表示当前的纬度为39°39.7’。头两个字符(39)表示度,余下的部分(39.7)表示分。经度和纬度是相同的结构,从这个语句来看要注意,头三个字符表示经度的度(105°06.6’)。第五和第七个单词标示“半球”,其中“N”代表“北半球”,“W”代表“西经”。半球信息放在数字部分后面组成完整的测量信息。 我还发现NMEA描述在事件驱动下使工作更容易完成。这是因为并不是按照特定的顺序来获取数据。一个事件驱动类为一应用程序给出了它最具灵活性和响应性的描述。因此,我也将使用事件来设计描述,从而获取信息。PositionReceived是第一个事件,它将记录当前获得的纬度和经度。清单 1-2 扩展这个描述器,来报告当前位置。
清单 1-2:这个描述器可以报告当前的纬度和经度。
'*******************************************************
'*************  清单 1-2. 从语句中提取信息  *************
'*******************************************************
Public Class NmeaInterpreter
  ' 当前位置变化时,记录新位置
专业的3S站 3s8.cn
  Public Event PositionReceived(ByVal latitude As String, _
                                ByVal longitude As String)
  ' 处理GPS接收器的信息
  Public Function Parse(ByVal sentence As String) As Boolean
    ' 通过匹配首单词来决定下一步的工作
    Select Case GetWords(sentence)(0) 专业的3S站 3s8.cn
      Case "$GPRMC"      ' 一条“推荐最小”的语句被找到!
        Return ParseGPRMC(sentence)
      Case Else
        ' 标示这条语句为不可用
        Return False
    End Select 中国3S吧 3s8.cn
  End Function
  ' 将语句分解为单词
  Public Function GetWords(ByVal sentence As String) As String()
    Return sentence.Split(","c)
  End Function
  ' 描述 $GPRMC 消息
  Public Function ParseGPRMC(ByVal sentence As String) As Boolean 中国3S吧 3s8.cn
    ' 将语句分解为单词
    Dim Words() As String = GetWords(sentence)
    ' 我们是否有足够的数据来描述当前位置?
    If Words(3) <> "" And Words(4) <> "" And Words(5) <> "" And _
      Words(6) <> "" Then
      ' 是,则提取纬度和经度
中国3S吧 3s8.cn

      Dim Latitude As String = Words(3).Substring(0, 2) & "°" ' 获取度
      Latitude = Latitude & Words(3).Substring(2) & """"      ' 获取分
      Latitude = Latitude & Words(4)    ' 获取半球
      Dim Longitude As String = Words(5).Substring(0, 3) & "°" ' 获取度
      Longitude = Longitude & Words(5).Substring(3) & """"    ' 获取分
专业的3S站 3s8.cn

      Longitude = Longitude & Words(6)    ' 获取半球
      ' 将该变化通知应用程序
      RaiseEvent PositionReceived(Latitude, Longitude)
    End If
    ' 表示该语句可用
    Return True 专业的3S站 3s8.cn
  End Function
End Class

1145

主题

10万

铜板

2

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
21817

灌水勋章活跃勋章冰雪节勋章

QQ
发表于 2013-11-9 18:51 | 显示全部楼层
进来学习 学习

评分

参与人数 1铜板 +1 收起 理由
admin + 1 亲,你好快哦~~~

查看全部评分

加强科技支撑和引领  实现地质找矿新突破 。     
回复 支持 反对

使用道具 举报

65

主题

6267

铜板

24

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1653
发表于 2014-1-29 22:51 | 显示全部楼层
学习了,,,,,
回复

使用道具 举报

10

主题

6347

铜板

8

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1120
发表于 2014-2-26 22:41 | 显示全部楼层
进来看看了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表