python解析nmea0183协议获取GPS定位信息

这里写自定义目录标题

python解析nmea0183协议获取GPS定位信息

nmea0183协议里面定位数据主要在GPRMC报文里面,下面是报文的大体形式:

b'$GPRMC,111025.00,A,2517.033747,N,11019.176025,E,0.0,144.8,270920,2.3,W,A*2D\r\n'
b'$GPRMC,,V,,,,,,,,,,N*53\r\n'
b'$GPRMC,024443.0,A,2517.038296,N,11019.174048,E,0.0,,120201,0.0,E,A*2F\r\n'

下面是报文说明
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输) 1节=1.852千米(km/h)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

#把度秒转成小数
def parse_loc_val(val, d):
    v = float(val)/100
    v = int(v) + (v-int(v))*100/60
    if d=='S' or d=='W':
        v = v * -1
    return v
#获取经纬度信息
def parse_gprmc(data):
    '''
    b'$GPRMC,111025.00,A,2517.033747,N,11019.176025,E,0.0,144.8,270920,2.3,W,A*2D\r\n'
    b'$GPRMC,,V,,,,,,,,,,N*53\r\n'
    b'$GPRMC,024443.0,A,2517.038296,N,11019.174048,E,0.0,,120201,0.0,E,A*2F\r\n'
    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF> 
    <1> UTC时间,hhmmss(时分秒)格式 
    <2> 定位状态,A=有效定位,V=无效定位 
    <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
    <4> 纬度半球N(北半球)或S(南半球) 
    <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
    <6> 经度半球E(东经)或W(西经)
    <7> 地面速率(000.0~999.9节,前面的0也将被传输) 1节=1.852千米(km/h)
    <8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输) 
    <9> UTC日期,ddmmyy(日月年)格式 
    <10> 磁偏角(000.0~180.0度,前面的0也将被传输) 
    <11> 磁偏角方向,E(东)或W(西) 
    <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
    '''
    li = data.decode().replace('$GPRMC,', '').strip().split(',')
    lat=log=speed=direct=0
    if li[1] == 'A':
        lat = round(parse_loc_val(li[2], li[3]), 6)   #纬度
        log = round(parse_loc_val(li[4], li[5]), 6)   #经度
        speed = float(li[6]) * 1.852
        if len(li[7])>0:
            direct = float(li[7])
        else:
            direct = 0
        #logging.info('lat:{:.6f},log:{:.6f},speed:{},direct:{}'.format(lat, log, speed, direct))
    return (lat,log,speed, direct)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值