地理信息快速检索实验
实验目的:本实验旨在掌握Python操作MongoDB的方法。
数据来源:北京市2013年5月1日出租车轨迹数据
数据说明
原始数据为用逗号隔开的txt格式文件,示例数据如下表所示:
ID | UTC时间 | 经度 | 纬度 | 行驶方向 | 行驶速度 | GPS状态 |
---|---|---|---|---|---|---|
2828 | 1367341199 | 11630103 | 4004140 | 333 | 0.0 | 1 |
GPS状态用0、1、16、17表示,不同数字对应的含义如下:
0:表示空车,GPS定位无效
1:表示空车,GPS定位有效
16:表示重车,GPS定位无效
17:表示重车,GPS定位有效
其中,重车表示出租车载客,数据见data文件夹。
在MongoDB中数据的组织格式如下图所示:
数据入库
1)创建数据库
命令:use db_taxi
2)查看数据库
命令:db
2)创建集合
命令:db.createCollection(“taxi”)
3)导入数据
import pymongo
import json
import time
db_name='db_taxi'
collection_name='taxi'
filePath='../data/2013050100.txt'
def DataTran(num):
return float(num) / 100000
def insert(ls,db):
index=0
flag=0
doclist=[]
for line in ls:
l=line.rstrip('\n').split(',',6)
doc={}
point={}
doc['taxi_id']=str(l[0])
doc['utc_time']=str(l[1])
point['type']='Point'
point['coordinates']=[DataTran(l[2]),DataTran(l[3])]
doc['position']=point
doc['direction']=float(l[4])
doc['speed']=float(l[5])*0.036
doc['gps']=int(l[6])
\# record=json.dumps(doc,ensure_ascii=False)
\# db[collection_name].insert(doc)
index=index+1
doclist.append(doc)
if index%1000==0:
db[collection_name].insert_many(doclist)
doclist.clear()
flag=flag+1
print(str(flag*1000)+"created\n")
index=0
def getData(filePath):
ls=[]
file=open(filePath,'r')
for line in file:
ls.append(line)
file.close()
return ls
if __name__ == "__main__":
client=pymongo.MongoClient('mongodb://localhost:27017')
dblist=client.list_database_names()
db=client[db_name]
insert(getData(filePath),db)
2.3 创建索引
命令:db.taxi.createIndex({position:” 2dsphere”})
2dsphere:球面查询(即把点坐标数据当做球面经纬度处理)。
2d:平面查询(即将点坐标数据当做平面直角坐标系点坐标处理)和一些球面查询,虽然2d索引支持一些球面查询,但是对这些球面查询使用2d索引可能会导致错误,这样的数据尽量优先使用2dsphere索引。
查看已创建索引
命令:db.taxi.getIndexes()
车辆轨迹检索
import pymongo
def query(position,time):
client=pymongo.MongoClient("mongodb://localhost:27017")
db=client['db_taxi']
taxis=db['taxi']
taxi_list=taxis.find({'utc_time':time,'position':{'$near':{'type':'Point','coordinates':position}}}).limit(5)
for taxi in taxi_list:
print(taxi)
client.close()
if __name__ == "__main__":
time='1367337885'
position=[116.43408, 40.07472]
query(position,time)
for taxi in taxi_list:
print(taxi)
client.close()
if __name__ == "__main__":
time='1367337885'
position=[116.43408, 40.07472]
query(position,time)
运行结果: