python实现物体定位

来源:互联网 发布:python 寻找相似图片 编辑:程序博客网 时间:2024/04/29 02:09

    前段时间利用实验室的器材写了一个小小的项目,简单的整理了一下(并不完善),现在分享一下。实验的内容是:使用卫星定位信息接收器,接收物体的位置信息(包括经度纬度等等),然后解析这些数据,然后根据经度纬度等信息通关百度地图API获取物体的具体位置信息,实现对物体的定位!

    我使用的开发语言重要是python,主要的有:serial串口通信,MySQLdb库,urllib2库,httplib库等等。下面就开始简单的说说实验中的问题。

1.首先使用的串口通信接收卫星接收器传出来的信息,我使用串口助手看了一下接收到的信息的样式,大概如下:


上图就是实验过程中的数据部分,我主要提取出来的是时间,海拔,经度,维度等信息。可以看出这些数据并不是单独成行的所以我需要将他们一个一个的提取出来(这并不是很难),然后利用经度纬度信息,使用百度地图API提供的地址解析服务获取物体的具体位置的描述,我使用的是一个HTTP服务,返回的是一个json的格式的位置信息,我事先测试库一下,返回的json格式的位置信息大概如下所示:


然后我从中获取具体位置描述信息,然后将它保存到数据库中。另外在试验中我使用了两张表,一张记录从从串口提取出来的信息,一张保存解析后的位置信息,而这两张表有相同的一项,就是时间,表的内容后面我会以图片的形式放出来。下面就附上我的代码,然后给出实验的结果。

# coding:utf8'''Created on 2016年6月14日@author: zou'''import serialimport MySQLdbimport urllib2import urllibimport httplibimport jsonimport timeser = 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=0while 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 countdb.close()############################################################                        #关闭端口ser.close()
实验的结果如下:


相应的两张表的内容如下:

到这里这个实验的内容说完了,大家若是有什么问题的话欢迎给我留言。

0 0