基本原理
GPS模塊輸出的數(shù)據(jù)是NMEA格式,其中GPGGA字段包含我們需要的經(jīng)緯度信息。
例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F
其中 4250.5589,S,14718.5084,E 就是經(jīng)度和緯度數(shù)據(jù),其格式是
緯度:ddmm.mmmmm(度分)
經(jīng)度:dddmm.mmmmm(度分)
google Earth Pro是免費(fèi)、強(qiáng)大的地圖工具,它支持導(dǎo)入包含經(jīng)緯度的csv文件,用來描點(diǎn),使我們更直觀的看gps的定位信息。(算了吧,國內(nèi)基本無法連接的,看接下來用高德)
但是google Earth Pro中需要dd.ddddd格式的經(jīng)緯度,所以我們要將ddmm.mmmm轉(zhuǎn)換成dd.ddddd。
NEMA轉(zhuǎn) 分度秒公式(WGS標(biāo)準(zhǔn))
轉(zhuǎn)換公式 dd.ddddd = dd + mm.mmmm/60
網(wǎng)上很多其它文章的公式都是錯(cuò)誤的。
再進(jìn)一步轉(zhuǎn)成國內(nèi)第三方地圖
由于一些特殊原因,地圖經(jīng)緯度在國內(nèi)還要轉(zhuǎn)一下:
可以要第三方地圖,例如高德或百度,還需要再轉(zhuǎn)一次坐標(biāo)。以高德為例,需要調(diào)用http接口轉(zhuǎn)換,轉(zhuǎn)換可以是多組,特別適合服務(wù)器一次請求多個(gè)的情況:
https://lbs.amap.com/api/webservice/guide/api/convert

轉(zhuǎn)換完之后快速找地圖驗(yàn)證一下,查看位置。
高德驗(yàn)證地址在這里:(根據(jù)經(jīng)緯度反查)
https://lbs.amap.com/console/show/picker
116.487585177952,39.991754014757

附上我的GPS轉(zhuǎn)高德參考源碼
//String gpsSection = "0000.0000N00000.0000E";
{
log.info("detect GPS data");
int nPos = gpsSection.indexOf("N");
int ePos = gpsSection.indexOf("E");
//緯度:ddmm.mmmmm(度分)
//經(jīng)度:dddmm.mmmmm(度分)
//dd.ddddd = dd + mm.mmmm/60
final double originLat = Double.valueOf(gpsSection.substring(0, nPos));
final double originLng = Double.valueOf(gpsSection.substring(nPos+1, ePos));
final double lat = Math.floor(originLat/100) + (originLat - Math.floor(originLat/100)*100)/60;
final double lng = Math.floor(originLng/100) + (originLng - Math.floor(originLng/100)*100)/60;
log.info("from GPS, lng=" + lng + ", lat=" + lat);
//A: 取gps段數(shù)據(jù)
watchCommHelper.es.execute(new Runnable() {
@Override
public void run() {//convertGpsToGd是從高德轉(zhuǎn)換接口去把GPS度分格式轉(zhuǎn)成高德經(jīng)緯度
XhLocInfo xhLocInfo = watchCommHelper.convertGpsToGd(lng, lat);
//添加處理
}
});
}