電子海圖(ENC)中規(guī)定的坐標(biāo)系為WGS-84,該坐標(biāo)系就是GPS所采用的坐標(biāo)系,因此電子海圖系統(tǒng)必須要接入GPS數(shù)據(jù)。其實(shí),衛(wèi)星定位系統(tǒng)中,除了GPS,還有中國的北斗、俄羅斯的GLONASS和歐盟的Galileo,這些定位接收器的數(shù)據(jù)都可以通過NMEA0813傳輸。
| 設(shè)備類型 | 描述 | 設(shè)備類型 | 描述 | 設(shè)備類型 | 描述 |
|---|---|---|---|---|---|
| BD | 北斗 | GP | GPS | GN | 多衛(wèi)星組合導(dǎo)航 |
| GL | GLONASS | GA | Galileo | EC | ECDIS |
GPS報(bào)文格式有很多種,具體可參見https://gpsd.gitlab.io/gpsd/NMEA.html,但常見的有:
- RMC 推薦最小定位信息
1 2 3 4 5 6 7 8 9 10 1112 13
| | | | | | | | | | | | |
$--RMC,hhmmss.ss,A,llll.llll,a,yyyyy.yyyy,a,x.x,x.x,xxxx,x.x,a,m,*hh<CR><LF>
$GPRMC,075629.80,V,3759.2680,N,02334.6295,E,0.46,171.32,211206,2.6,W,N*34
字段1:定位時(shí)的世界時(shí)UTC;如:075629.80=07:56:29.80Z
字段2:狀態(tài):A=有效;V=警告
字段3:緯度:如:3759.2680=37°59.2680'
字段4:緯度的方向 N 或 S
字段5:經(jīng)度;如:02334.6295=23°34.6295'
字段6:經(jīng)度的方向 E 或 W
字段7:對地航速;如:0.46kn
字段8:對地航向;如:171.32°
字段9:日期,形式ddMMyy,起點(diǎn)為2000年;如:211206=2006-12-21
字段10:磁差;如:2.6°
字段11:磁差的方向 E 或 W
字段12:FAA模式指示符(A=自主定位,D=差分,E=估算,N=數(shù)據(jù)無效)
字段13:校驗(yàn)和;如:34
- GGA 定位數(shù)據(jù)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| | | | | | | | | | | | | | |
$--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh<CR><LF>
$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47
字段1:定位時(shí)的世界時(shí)UTC;如:001043.00=00:10:43.00Z
字段2:緯度:如:4404.14036=44°04.14036'
字段3:緯度的方向 N 或 S
字段4:經(jīng)度;如:12118.85961=121°18.85961'
字段5:經(jīng)度的方向 E 或 W
字段6:GPS定位質(zhì)量指示符;如:1=GPS定位
字段7:衛(wèi)星的使用量;如:12
字段8:水平精度因子;如:0.98米
字段9:天線高度(相對于平均海面);如:1113.0
字段10:天線高度單位;如:米
字段11:坐標(biāo)系與平均海面的差值;如:-21.3
字段12:差值的單位;如:米
字段13:差分GPS數(shù)據(jù)期限
字段14:差分參考基站ID,取值0000-1023
字段15:校驗(yàn)和;如:47
- GSA GPS精度因子與當(dāng)前衛(wèi)星
1 2 3 4 5 6 7 8 91011121314 15 16 17 18
| | | | | | | | | | | | | | | | | |
$--GSA,a,a,x,x,x,x,x,x,x,x,x,x,x,x,x.x,x.x,x.x*hh<CR><LF>
$GNGSA,A,3,80,71,73,79,69,,,,,,,,1.83,1.09,1.47*17
字段1:定位模式 M=手動;A=自動
字段2:定位類型 1=無定位;2=2D定位;3=3D定位
字段3:第1信道使用中的PRN碼編號
字段4:第2信道使用中的PRN碼編號
字段5:第3信道使用中的PRN碼編號
字段6:第4信道使用中的PRN碼編號
字段7:第5信道使用中的PRN碼編號
字段8:第6信道使用中的PRN碼編號
字段9:第7信道使用中的PRN碼編號
字段10:第8信道使用中的PRN碼編號
字段11:第9信道使用中的PRN碼編號
字段12:第10信道使用中的PRN碼編號
字段13:第11信道使用中的PRN碼編號
字段14:第12信道使用中的PRN碼編號
字段15:PDOP位置精度因子
字段16:HDOP水平精度因子
字段17:VDOP垂直精度因子
字段18:校驗(yàn)和
- GLL 地理位置:經(jīng)/緯度
1 2 3 4 5 6 7 8
| | | | | | | |
$--GLL,llll.ll,a,yyyyy.yy,a,hhmmss.ss,a,m,*hh<CR><LF>
$GNGLL,4404.14012,N,12118.85993,W,001037.00,A,A*67
字段1:緯度
字段2:緯度的方向 N 或 S
字段3:經(jīng)度
字段4:經(jīng)度的方向 E 或 W
字段5:定位時(shí)的世界時(shí)UTC
字段6:狀態(tài):A=有效;V=無效
字段7:FAA模式指示符
字段8:校驗(yàn)和
- GST 偽距噪聲統(tǒng)計(jì)
1 2 3 4 5 6 7 8 9
| | | | | | | | |
$ --GST,hhmmss.ss,x,x,x,x,x,x,x,*hh<CR><LF>
$GPGST,182141.000,15.5,15.3,7.2,21.8,0.9,0.5,0.8*54
字段1:時(shí)間
字段2:RMS的標(biāo)準(zhǔn)差
字段3:誤差橢圓長半軸的標(biāo)準(zhǔn)差(米)
字段4:誤差橢圓短半軸的標(biāo)準(zhǔn)差(米)
字段5:誤差橢圓長半軸的方向(度)
字段6:緯度誤差的標(biāo)準(zhǔn)差(米)
字段7:經(jīng)度誤差的標(biāo)準(zhǔn)差(米)
字段8:高度誤差的標(biāo)準(zhǔn)差(米)
字段9:校驗(yàn)和
- GSV 可見衛(wèi)星的信息
1 2 3 4 5 6 7 n
| | | | | | | |
$--GSV,x,x,x,x,x,x,x,...*hh<CR><LF>
$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D
字段1:GSV報(bào)文總數(shù)
字段2:當(dāng)前組內(nèi)報(bào)文編號
字段3:可見衛(wèi)星的總數(shù)
字段4:衛(wèi)星編號
字段5:仰角
字段6:方位角
字段7:信噪比 (有多少衛(wèi)星,字段4-7會重復(fù)多少次)
- VTG 對地航向和航速
1 2 3 4 5 6 7 8 9 10
| | | | | | | | | |
$--VTG,x.x,T,x.x,M,x.x,N,x.x,K,m,*hh<CR><LF>
$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34
字段1:對地航向
字段2:T=真航向
字段3:對地航向
字段4:M=磁航向
字段5:對地航速
字段6:N=kn
字段7:對地航速
字段8:K=千米/時(shí)
字段9:FAA模式指示符
字段10:校驗(yàn)和
- ZDA 日期時(shí)間
1 2 3 4 5 6 7
| | | | | | |
$--ZDA,hhmmss.ss,xx,xx,xxxx,xx,xx*hh<CR><LF>
$GPZDA,160012.71,11,03,2004,-1,00*7D
字段1:UTC時(shí)間
字段2:天;范圍:01~31
字段3:月;范圍:01~12
字段4:年
字段5:當(dāng)?shù)貢r(shí)時(shí)差;范圍:-13~+13
字段6:本地時(shí)分鐘差;范圍:00~59
字段7:校驗(yàn)和
新建靜態(tài)類GPSParser,對GPS報(bào)文進(jìn)行','拆分,根據(jù)不同的報(bào)文進(jìn)行解碼,解碼結(jié)果以鍵值對的形式封裝進(jìn)哈希表中:
public static class GPSParser
{
public static Hashtable ParseSentence(string sentence)
{
var ss = sentence.Split(',');
switch (ss[0])
{
case "$GPRMC":
return GpsMessage_RMC(ss);
... 其他報(bào)文
default:
throw new Exception($"暫不支持解析GPS報(bào)文[{ss[0]}]");
}
}
private static Hashtable GpsMessage_RMC(string[] ss)
{
//時(shí)間格式解析
var utc = new DateTime(
2000+int.Parse(ss[9].Substring(4,2)),
int.Parse(ss[9].Substring(2,2)),
int.Parse(ss[9].Substring(0,2)),
int.Parse(ss[1].Substring(0,2)),
int.Parse(ss[1].Substring(2,2)),
int.Parse(ss[1].Substring(4,2)),
DateTimeKind.Utc);
//緯度
var lat = int.Parse(ss[3].Substring(0, 2)) + double.Parse(ss[3].Substring(2)) / 60;
if (ss[4] == "S") lat *= -1;
//經(jīng)度
var lon = int.Parse(ss[5].Substring(0, 3)) + double.Parse(ss[5].Substring(3)) / 60;
if (ss[6] == "W") lon *= -1;
var res = new Hashtable
{
{"UTCTime", utc},
{"Status", ss[2]},
{"Latitude", lat},
{"Longitude", lon},
{"SpeedOverGround", double.Parse(ss[7])},
{"TrackMadeGood", double.Parse(ss[8])},
{"MagneticVariation", ss[10]+ss[11]},
{"FAAModeIndicator", ss[12]},
};
return res;
}
}