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

panmingguang 发布于 2016/05/25 10:04
阅读 1K+
收藏 0

和设备上合作做了一个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 标准么, 还是需要 做其他处理.

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



加载中
0
panmingguang
panmingguang
有做gps 模块的 数据便宜 纠正的 给点 意见啊
0
panmingguang
panmingguang
不能沉了啊, 有谁做过 gps模块数据解析的, 给个 方向啊
0
AlanShi
AlanShi

这是几年前用的办法,不保证能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



panmingguang
panmingguang
我用这个算过一下, (GCJ-02) 与百度坐标系 (BD-09) 这两个转一下还行, WGS84 的就不对了, 不知道是不是 gps模块返回的数据 不是WGS84, 或者要处理啊, 按理来说不应该啊
0
panmingguang
panmingguang
已经解决, 纬度ddmm.mmmm(度分)格式(前面的0也将被传输), 主要是这个格式没明白, dd是度数, mm是分, 0.mmmm是秒(格式是分, 要转成秒),  然后转成小数10进制, 然后用上面的 转换方式 就对了 
下一个_雨季
???没明白
返回顶部
顶部