开发者社区> 问答> 正文

gps 模块返回的 经纬度 怎么对应上 百度或者 高德 gps经纬度 :报错

和设备上合作做了一个gps 模块, 获取数据, 模块协议是 nmea-0183 , 协议内容网上搜了一下

1. 下面数据选择 是使用GPRMC, 还是GPGGA

信息类型为:
GPGSV:可见卫星信息
GPGLL:地理定位信息
GPRMC:推荐最小定位信息  // 使用这个数据
GPVTG:地面速度信息
GPGGA:GPS定位信息      // 还是用这个数据
GPGSA:当前卫星信息

其中

<2> 定位状态,A=有效定位,V=无效定位

<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)

<4> 纬度半球N(北半球)S(南半球)

<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)

<6> 经度半球E(东经)W(西经)

2. 经纬度返回数据格式如上图, 例如设备商返回我的数据 11956.7389,3150.1705, 这个值是直接->119.567389,31.501705 就是wgs84 标准么, 还是需要 做其他处理.

我使用百度转换接口 测试, 地址偏移量有点大, 完全就不对



展开
收起
kun坤 2020-06-14 07:28:01 651 0
1 条回答
写回答
取消 提交回答
  • 有做gps 模块的 数据便宜 纠正的 给点 意见啊######不能沉了啊, 有谁做过 gps模块数据解析的, 给个 方向啊######

    这是几年前用的办法,不保证能100%用。

    #!/usr/bin/env python
    #coding=utf-8
    
    import math
    
    pi = 3.14159265358979324
    a = 6378245.0
    ee = 0.00669342162296594323
    
    #纠偏函数
    def transform(wgLat,wgLon):
        latlng = [0]*2
        if outOfChina(wgLat, wgLon):
            latlng[0] = wgLat;  
            latlng[1] = wgLon; 
    
        dLat = transformLat(wgLon - 105.0, wgLat - 35.0)
        dLon = transformLon(wgLon - 105.0, wgLat - 35.0)
        radLat = wgLat / 180.0 * pi
        magic = math.sin(radLat)
        magic = 1 - ee * magic * magic
        sqrtMagic = math.sqrt(magic)
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi)
        dLon = (dLon * 180.0) / (a / sqrtMagic * math.cos(radLat) * pi)
        latlng[0] = wgLat + dLat
        latlng[1] = wgLon + dLon
        return latlng
    
    def outOfChina(lat,lon):
        if (lon < 72.004 or lon > 137.8347): 
            return True  
        if (lat < 0.8293 or lat > 55.8271):
            return True  
        return False
    
    def transformLat(x,y):
    
        ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x)) 
        ret += (20.0 * math.sin(6.0 * x * pi) + 20.0 * math.sin(2.0 * x * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(y * pi) + 40.0 * math.sin(y / 3.0 * pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(y / 12.0 * pi) + 320 * math.sin(y * pi / 30.0)) * 2.0 / 3.0 
        return ret
    
    def transformLon(x,y):
    
        ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x)) 
        ret += (20.0 * math.sin(6.0 * x * pi) + 20.0 * math.sin(2.0 * x * pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(x * pi) + 40.0 * math.sin(x / 3.0 * pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(x / 12.0 * pi) + 300.0 * math.sin(x / 30.0 * pi)) * 2.0 / 3.0
        return ret



    ######我用这个算过一下, (GCJ-02) 与百度坐标系 (BD-09) 这两个转一下还行, WGS84 的就不对了, 不知道是不是 gps模块返回的数据 不是WGS84, 或者要处理啊, 按理来说不应该啊###### 已经解决,  纬度 ddmm.mmmm( 度分 ) 格式 ( 前面的 0 也将被传输 ), 主要是这个格式没明白, dd是度数, mm是分, 0.mmmm是秒(格式是分, 要转成秒),  然后转成小数10进制, 然后用上面的 转换方式 就对了 ######???没明白
    2020-06-14 07:28:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
AIOps-百度的思考与实践 立即下载
百度外卖从IDC到云端服务迁移历程 立即下载
百度研发工具集的应用实践——打造持续交付路上的“三堵墙” 立即下载