一、借助GPS定位仪记录经纬度信息的小伙伴,可以最下面代码解析设备的原始信息;
#-*- coding: utf-8 -*-
import serial
import serial.tools.list_ports
import os
import re
from log import *
import time
class GPSModuleControl:
def __init__(self):
self.device_name='Prolific Technology, Inc. PL2303 Serial Port'
def get_ttyusb(self):
cm = os.popen('ls /dev/ttyUSB*')
ttyusb = cm.readlines()
cm.close()
ttyusb_list = []
for usb in ttyusb:
ttyusb_list.append(usb.strip().split(r'/')[-1])
return ttyusb_list
def get_dev_ttyusb(self):
devid = self.get_device_id()
product = 'grep PRODUCT= /sys/bus/usb-serial/devices/%s/../uevent'
if devid:
for ttyusb in self.get_ttyusb():
cm = os.popen(product % ttyusb)
lines= cm.readlines()[0]
cm.close()
m=re.search('PRODUCT=(\w+)/(\w+)',lines)
if (m.group(1)==devid[0]) and (m.group(2)==devid[1]):
break
return ttyusb
else:
return None
def get_device_id(self):
cm = os.popen('lsusb')
usbdevice = cm.readlines()
cm.close()
strTemp=None
for dev in usbdevice:
if self.device_name in dev:
strTemp=re.search('ID (\w+):(\w+)',dev)
break
if strTemp == None:
print('No gps device')
return None
else:
devid=[]
devid.append(strTemp.group(1).strip('0'))
devid.append(strTemp.group(2).strip('0'))
return devid
def getGPSData(self):
strReturn=""
strPortName=self.get_dev_ttyusb()
if strPortName==None:
log("No GPS Module port")
return strReturn
log("GPS Module port is:"+strPortName)
ser = serial.Serial('/dev/'+strPortName, 4800, timeout=3)
count=0
while 30-count>0:
strGPSData = ser.readline()
if strGPSData.find("GPGGA")>=0:
strReturn=strGPSData
break
time.sleep(1)
count+=1
ser.close()
log("GPS DATA is:"+strReturn)
return strReturn
if __name__ == '__main__':
GPSmodule=GPSModuleControl()
GPSmodule.getGPSData()
二、GPGGA数据含义
$GPGGA
例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,0000*1F
字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
字段1:UTC 时间,hhmmss.sss,时分秒格式
字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段3:纬度N(北纬)或S(南纬)
字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段5:经度E(东经)或W(西经)
字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
字段8:HDOP水平精度因子(0.5 - 99.9)
字段9:海拔高度(-9999.9 - 99999.9)
字段10:地球椭球面相对大地水准面的高度
字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
字段13:校验值
三、若使用其他原始数据,具体NEMA-0183协议请自行百度,包括( G P R M C 、 GPRMC、 GPRMC、GPGSV、$GPGSA)
四、注意这里得到的经纬度,属于度分格式,需要换算成一般格式,例如:14718.5084 ==> 147+18.5084/60=147.3084733333333333(WGS坐标系) ,若要转换成百度坐标系,高德坐标系,谷歌坐标系都有相应的规则,这里就不多阐述了,可以参考相应的开发文档!