当前位置: 首页>数据库>正文

GPS模块软件处理的坑:分度秒转成分度

基本原理

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

GPS模块软件处理的坑:分度秒转成分度,第1张

转换完之后快速找地图验证一下,查看位置。
高德验证地址在这里:(根据经纬度反查)
https://lbs.amap.com/console/show/picker

116.487585177952,39.991754014757

GPS模块软件处理的坑:分度秒转成分度,第2张

附上我的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);
            //添加处理
        }
    });

}

https://www.xamrdz.com/database/6wt1994726.html

相关文章: