基本原理
GPS模块输出的数据是NMEA格式,其中GPGGA字段包含我们需要的经纬度信息。
例:$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 就是经度和纬度数据,其格式是
纬度:ddmm.mmmmm(度分)
经度:dddmm.mmmmm(度分)
google Earth Pro是免费、强大的地图工具,它支持导入包含经纬度的csv文件,用来描点,使我们更直观的看gps的定位信息。(算了吧,国内基本无法连接的,看接下来用高德)
但是google Earth Pro中需要dd.ddddd格式的经纬度,所以我们要将ddmm.mmmm转换成dd.ddddd。
NEMA转 分度秒公式(WGS标准)
转换公式 dd.ddddd = dd + mm.mmmm/60
网上很多其它文章的公式都是错误的。
再进一步转成国内第三方地图
由于一些特殊原因,地图经纬度在国内还要转一下:
可以要第三方地图,例如高德或百度,还需要再转一次坐标。以高德为例,需要调用http接口转换,转换可以是多组,特别适合服务器一次请求多个的情况:
https://lbs.amap.com/api/webservice/guide/api/convert
转换完之后快速找地图验证一下,查看位置。
高德验证地址在这里:(根据经纬度反查)
https://lbs.amap.com/console/show/picker
116.487585177952,39.991754014757
附上我的GPS转高德参考源码
//String gpsSection = "0000.0000N00000.0000E";
{
log.info("detect GPS data");
int nPos = gpsSection.indexOf("N");
int ePos = gpsSection.indexOf("E");
//纬度:ddmm.mmmmm(度分)
//经度: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段数据
watchCommHelper.es.execute(new Runnable() {
@Override
public void run() {//convertGpsToGd是从高德转换接口去把GPS度分格式转成高德经纬度
XhLocInfo xhLocInfo = watchCommHelper.convertGpsToGd(lng, lat);
//添加处理
}
});
}