地理信息快速检索实验,Python操作MongoDB的方法。

地理信息快速检索实验

实验目的:本实验旨在掌握Python操作MongoDB的方法。

数据来源:北京市2013年5月1日出租车轨迹数据

数据说明

原始数据为用逗号隔开的txt格式文件,示例数据如下表所示:

IDUTC时间经度纬度行驶方向行驶速度GPS状态
282813673411991163010340041403330.01

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+1print(str(flag*1000)+"created\n")

​      index=0def 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)

 


运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粉尘伴终生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值