gps nmea数据格式解析与生成

一、nmea数据格式介绍
nmea数据如下: 
$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54 
$GNRMC,230134.00,A,2237.12422,N,11408.08310,E,9.291,215.59,310518,,,A*75
$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04 
$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D 
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70 
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E 
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D
说明:NMEA0183格式以“$”开始,主要语句有GPGGA,GPVTG,GPRMC等
1、 GPS DOP and Active Satellites(GSA)当前卫星信息
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>
<1>模式 :M = 手动, A = 自动。 
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。 
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。 
<4> PDOP位置精度因子(0.5~99.9) 
<5> HDOP水平精度因子(0.5~99.9) 
<6> VDOP垂直精度因子(0.5~99.9) 
<7> Checksum.(检查位).

2、 GPS Satellites in View(GSV)可见卫星信息 
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>
<1> GSV语句的总数 
<2> 本句GSV的编号 
<3> 可见卫星的总数,00 至 12。 
<4> 卫星编号, 01 至 32。 
<5>卫星仰角, 00 至 90 度。 
<6>卫星方位角, 000 至 359 度。实际值。 
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。 
<8>Checksum.(检查位).
第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。
3、Global Positioning System Fix Data(GGA)GPS定位信息
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式 
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
<3> 纬度半球N(北半球)或S(南半球) 
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
<5> 经度半球E(东经)或W(西经) 
<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算 
<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输) 
<8> HDOP水平精度因子(0.5~99.9) 
<9> 海拔高度(-9999.9~99999.9) 
<10> 地球椭球面相对大地水准面的高度 
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空) 
<12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)

4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式 
<2> 定位状态,A=有效定位,V=无效定位 
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
<4> 纬度半球N(北半球)或S(南半球) 
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
<6> 经度半球E(东经)或W(西经) 
<7> 地面速率(000.0~999.9节,前面的0也将被传输) 
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输) 
<9> UTC日期,ddmmyy(日月年)格式 
<10> 磁偏角(000.0~180.0度,前面的0也将被传输) 
<11> 磁偏角方向,E(东)或W(西) 
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
5、 Track Made Good and Ground Speed(VTG)地面速度信息 
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF> 
<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输) 
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输) 
<3> 地面速率(000.0~999.9节,前面的0也将被传输) 
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输) 
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

二、gps数据解析与生成类


   
   
  1. / /CommonFunction.h
  2. #pragma once
  3. #include < string >
  4. #include <vector >
  5. / / 字符串分割
  6. int StringSplit(std ::vector <std :: string > & dst, const std :: string & src, const std :: string & separator);
  7. / / 去掉前后空格
  8. std :: string & StringTrim(std :: string &str);

   
   
  1. / /CommonFunction.cpp
  2. #include "stdafx.h"
  3. #include "CommonFunction.h"
  4. / / 字符串分割
  5. int StringSplit(std ::vector <std :: string > & dst, const std :: string & src, const std :: string & separator)
  6. {
  7. if (src.empty() || separator.empty())
  8. return 0;
  9. int nCount = 0;
  10. std :: string temp;
  11. size_t pos = 0, offset = 0;
  12. / / 分割第 1~n- 1
  13. while ((pos = src.find_ first_ of(separator, offset)) ! = std :: string ::npos)
  14. {
  15. temp = src.substr(offset, pos - offset);
  16. if (temp. length() >= 0) {
  17. dst.push_back(temp);
  18. nCount + +;
  19. }
  20. offset = pos + 1;
  21. }
  22. / / 分割第n个
  23. temp = src.substr(offset, src. length() - offset);
  24. if (temp. length() >= 0) {
  25. dst.push_back(temp);
  26. nCount + +;
  27. }
  28. return nCount;
  29. }
  30. / /去前后空格
  31. std :: string & StringTrim(std :: string &str)
  32. {
  33. if (str.empty()) {
  34. return str;
  35. }
  36. str.erase( 0, str.find_ first_ not_ of( " "));
  37. str.erase(str.find_ last_ not_ of( " ") + 1);
  38. return str;
  39. }

   
   
  1. / /GpsNmeaData.h
  2. / /gps nmea 数据解析与生成
  3. #pragma once
  4. #include "CommonFunction.h"
  5. / /gpsdata格式
  6. enum GpsDataFormat
  7. {
  8. GpsDataFormat_None = 0, / /none
  9. GpsDataFormat_GNRMC = 1, / /GNRMC
  10. GpsDataFormat_GPRMC = 2, / /GPRMC
  11. GpsDataFormat_GPGGA = 3, / /GPGGA
  12. };
  13. / / Status
  14. enum GpsStatus
  15. {
  16. GpsStatus_ Valid = 'A', / /数据有效(GPRMC /GNRMC)
  17. GpsStatus_ Invalid = 'V', / /数据无效(GPRMC /GNRMC)
  18. GpsStatus_NoLocation = '0', / /未定位(GPGGA)
  19. GpsStatus_NoDiffLocation = '1', / /非差分定位(GPGGA)
  20. GpsStatus_DiffLocation = '2', / /差分定位(GPGGA)
  21. GpsStatus_Estimating = '6', / /正在估算(GPGGA)
  22. };
  23. / /纬度方向
  24. enum GpsLatDirect
  25. {
  26. GpsLatDirect_N = 'N', / /北纬
  27. GpsLatDirect_S = 'S', / /南纬
  28. };
  29. / /经度方向
  30. enum GpsLngDirect
  31. {
  32. GpsLngDirect_E = 'E', / /东经
  33. GpsLngDirect_W = 'W', / /西经
  34. };
  35. / /磁偏角方向,E =东,W =西
  36. enum GpsDeclinationDirect
  37. {
  38. GpsDeclinationDirect_ Invalid = '0',
  39. GpsDeclinationDirect_E = 'E',
  40. GpsDeclinationDirect_W = 'W',
  41. };
  42. / /模式,A =自动,D =差分,E =估测,N =数据无效
  43. enum GpsMode
  44. {
  45. GpsMode_A = 'A',
  46. GpsMode_D = 'D',
  47. GpsMode_E = 'E',
  48. GpsMode_N = 'N',
  49. };
  50. class GpsNmeaData
  51. {
  52. public:
  53. GpsNmeaDat a();
  54. virtual ~GpsNmeaDat a();
  55. / /设置初始gps数据格式
  56. void SetInitGpsDataFormat(unsigned char ucInitGpsDataFormat);
  57. / /加载GPS字符串
  58. bool LoadGPSString(char *pInputString, bool bIsCompareChecksum = true);
  59. / /生成GPS字符串
  60. bool CreateGPSString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag);
  61. / /加载GPRMC字符串
  62. bool LoadGPRMCString(char *pInputString,std ::vector <std :: string > vecValue,bool bIsCompareChecksum = true);
  63. / /生成GPRMC字符串
  64. bool CreateGPRMCString(char *pOutputString, int & nOutputStringSize,bool bIsHasEndFlag);
  65. / /加载GNRMC字符串
  66. bool LoadGNRMCString(char *pInputString,std ::vector <std :: string > vecValue, bool bIsCompareChecksum = true);
  67. / /生成GNRMC字符串
  68. bool CreateGNRMCString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag);
  69. / /加载GPGGA字符串
  70. bool LoadGPGGAString(char *pInputString, std ::vector <std :: string > vecValue, bool bIsCompareChecksum = true);
  71. / /生成GPGGA字符串
  72. bool CreateGPGGAString(char *pOutputString, int & nOutputStringSize, bool bIsHasEndFlag);
  73. / /计算经纬度(根据速度和方向计算下一经纬度)
  74. void CalcLngLat(float fDirect, float fSpeed, double dOldLng, double dOldLat, double & dNewLng, double & dNewLat);
  75. void CalcLngLatEx(float fDirect, float fSpeed, double dOldLng, double dOldLat, double & dNewLng, double & dNewLat, int nKeepSeconds = 1);
  76. / /计算经纬度(根据距离和方向计算下一经纬度)
  77. void CalcLngLatByDistanceAndDirect(float fDirect, double fDistance, double dOldLng, double dOldLat, double & dNewLng, double & dNewLat);
  78. / /获取与设置参数
  79. void GetLng(double & fLng,unsigned char & ucDirect);
  80. void SetLng(double fLng, unsigned char ucDirect);
  81. void GetLat(double & fLat,unsigned char & ucDirect);
  82. void SetLat(double fLat, unsigned char ucDirect);
  83. float GetSpeed();
  84. void SetSpeed(float fSpeed);
  85. float GetDirect();
  86. void SetDirect(float fDirect);
  87. unsigned char GetStatus();
  88. void SetStatus(unsigned char ucStatus);
  89. unsigned char GetDeclination();
  90. void SetDeclination(unsigned char ucDeclination);
  91. unsigned char GetDeclinationDirect();
  92. void SetDeclinationDirect(unsigned char ucDeclinationDirect);
  93. unsigned char GetMode();
  94. void SetMode(unsigned char ucMode);
  95. unsigned char GetSatelliteNum();
  96. void SetSatelliteNum(unsigned char ucSatelliteNum);
  97. float GetHDOP();
  98. void SetHDOP(float fHDOP);
  99. float GetHigh();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值