python實現物體定位

    前段時間利用實驗室的器材寫了一個小小的項目,簡單的整理了一下(並不完善),現在分享一下。實驗的內容是:使用衛星定位信息接收器,接收物體的位置信息(包括經度緯度等等),然後解析這些數據,然後根據經度緯度等信息通關百度地圖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()
實驗的結果如下:


相應的兩張表的內容如下:

到這裏這個實驗的內容說完了,大家若是有什麼問題的話歡迎給我留言。

發佈了194 篇原創文章 · 獲贊 88 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章