前段时间利用实验室的器材写了一个小小的项目,简单的整理了一下(并不完善),现在分享一下。实验的内容是:使用卫星定位信息接收器,接收物体的位置信息(包括经度纬度等等),然后解析这些数据,然后根据经度纬度等信息通关百度地图API获取物体的具体位置信息,实现对物体的定位!
我使用的开发语言重要是python,主要的有:serial串口通信,MySQLdb库,urllib2库,httplib库等等。下面就开始简单的说说实验中的问题。
1.首先使用的串口通信接收卫星接收器传出来的信息,我使用串口助手看了一下接收到的信息的样式,大概如下:
上图就是实验过程中的数据部分,我主要提取出来的是时间,海拔,经度,维度等信息。可以看出这些数据并不是单独成行的所以我需要将他们一个一个的提取出来(这并不是很难),然后利用经度纬度信息,使用百度地图API提供的地址解析服务获取物体的具体位置的描述,我使用的是一个HTTP服务,返回的是一个json的格式的位置信息,我事先测试库一下,返回的json格式的位置信息大概如下所示:
然后我从中获取具体位置描述信息,然后将它保存到数据库中。另外在试验中我使用了两张表,一张记录从从串口提取出来的信息,一张保存解析后的位置信息,而这两张表有相同的一项,就是时间,表的内容后面我会以图片的形式放出来。下面就附上我的代码,然后给出实验的结果。
# coding:utf8 ''' Created on 2016年6月14日 @author: zou ''' import serial import MySQLdb import urllib2 import urllib import httplib import json import time ser = serial.Serial('COM4',9600) ###################################################### def recv(serial): data='' while True: tmp = serial.read(1) if tmp == '\n': break else: data += tmp return data ###################################################### def GetInfo(Str): info = [] tmp = Str[7:] strs='' for ch in tmp: if ch == '\n': return else: if ch == ',': info.append(strs) strs = '' else: strs = strs+ch return info ###################################################### def getYear(data): retdata = '' ret = '' tail = data #print tail tail = tail[::-1] #print tail count = 0 for ch in tail: if count == 3: #616022 if ch == ',': break else: ret += ch elif ch == ',': count=count+1 #print ret retdata+=ret[1] retdata+=ret[0] retdata+=ret[3] retdata+=ret[2] retdata+=ret[5] retdata+=ret[4] #print retdata return retdata ###################################################### def rightNum(strs,flag): ret='' if cmp(flag,'t')==0: #times 024335.00 ret=strs[0:2] ret+=':' ret+=strs[2:4] ret+=':' ret+=strs[4:6] elif cmp(flag,'l')==0:#latitude 3422.99947N if int(strs[0:3]) < 180: ret=strs[0:3] ret+='.' ret+=strs[3:5] ret+=strs[6:10] else: ret=strs[0:2] ret+='.' ret+=strs[2:4] ret+=strs[5:9] elif cmp(flag,'L')==0:#longitude 10858.95306E if int(strs[0:3]) < 180: ret=strs[0:3] ret+='.' ret+=strs[3:5] ret+=strs[6:10] else: ret=strs[0:2] ret+='.' ret+=strs[2:4] ret+=strs[5:9] else: return None return ret ######################################################### def Getlocation(db,ti,la,lo): #发送http请求获取具体位置信息 #import urllib url = 'http://api.map.baidu.com/geocoder/v2/' ak = 'ak=1aZ2PQG7OXlk9E41QPvB9WjEgq5WO8Do' #back='&callback=renderReverse&location=' back='&location=' location='34.992654,108.589507' output = '&output=json&pois=0' url = url + '?' + ak + back + location + output temp = urllib2.urlopen(url) hjson = json.loads(temp.read()) locate = hjson["result"]["formatted_address"] #省,市,县 #print locate mapinfo = hjson["result"]["sematic_description"] #详细描述 #print mapinfo #插入数据库 cur = db.cursor() sql="set names utf8" cur.execute(sql) info=[] info.append(ti.encode('utf8')) info.append(locate.encode('utf8')) info.append(mapinfo.encode('utf8')) for val in info: print val sql = "insert into mapinfo values(%s,%s,%s)" try: cur.execute(sql,info) except: print 'Insert mapinfo failed' ######################################################### #mysql , 经度,维度 db = MySQLdb.connect('localhost','root','',"zou",3306,'utf8') cursor = db.cursor() cursor.execute("DROP TABLE IF EXISTS Location") cursor.execute("DROP TABLE IF EXISTS mapinfo") sql="""CREATE TABLE Location( Time CHAR(20), Latitude CHAR(15), Longitude CHAR(15), Altitude CHAR(10))""" cursor.execute(sql) sql = """CREATE TABLE mapinfo( time CHAR(20), local CHAR(100), info CHAR(100))""" cursor.execute(sql) ''' #mysql , 位置描述信息 #database = MySQLdb.connect('localhost','root','',"zou",3306) #curkey = database.cursor() #curkey.execute("DROP TABLE IF EXISTS mapinfo") msql = """CREATE TABLE mapinfo( time CHAR(20), local CHAR(100), info CHAR(100))""" curkey.execute(msql) ''' ################################################################## Locat = [] #### #提取20项数据 count=0 while count<10: Info=[] year='' #如果输出为 $GPGGA 开头,则这一行表示的是位置信息 for val in range(0,8): data = recv(ser) tmp = data[0:6] #截取前6个字符 if cmp(tmp,'$GPRMC') == 0: #print data tmpyear = data[50:] year = getYear(tmpyear) #print year elif cmp(tmp,'$GPGGA') == 0: #条件满足的话就截取 #print data Info = GetInfo(data) if Info == []: break value=[] ti = year ti += '-' t = rightNum(Info[0],'t') ti += t #print ti value.append(ti) la = rightNum(Info[1],'l') value.append(la) lo = rightNum(Info[3],'L') value.append(lo) al = Info[8] value.append(al) #print value sql = "insert into Location values (%s,%s,%s,%s)" try: cursor.execute(sql,value) Getlocation(db,ti,la,lo) db.commit() except: print 'insert error' count=count+1 #print count db.close() ############################################################ #关闭端口 ser.close()实验的结果如下:
到这里这个实验的内容说完了,大家若是有什么问题的话欢迎给我留言。