在MongoDB中使用Python进行地理空间查询
首先需要安装pymongo和geopy模块:
pip install pymongo pip install geopy
然后连接到MongoDB数据库,并创建一个带有地理空间索引的collection:
from pymongo import MongoClient from pymongo import GEO2D import geopy # 连接到MongoDB client = MongoClient() db = client['test'] # 创建collection并添加地理空间索引 db.places.create_index([('location', GEO2D)]) # 向collection中添加文档 db.places.insert_many([ {'name': 'pidancode.com', 'location': [39.88, 116.40]}, {'name': '皮蛋编程', 'location': [39.90, 116.41]}, {'name': '北京', 'location': [39.90, 116.39]}, {'name': '上海', 'location': [31.24, 121.47]}, ])
接下来进行地理空间查询,例如查询距离某个坐标点最近的文档:
from geopy.distance import geodesic # 查询距离最近的文档 target = (39.89, 116.40) # 目标坐标点 cursor = db.places.find().sort([('location', '2d')]).limit(1) for doc in cursor: # 计算目标点与文档的距离 distance = geodesic(target, doc['location']).km print('距离 {} 最近的文档是 {},距离为 {:.2f} 公里'.format( target, doc['name'], distance))
输出结果为:
距离 (39.89, 116.4) 最近的文档是 pidancode.com,距离为 1.12 公里
另外还可以进行其它类型的地理空间查询,例如查询在某个矩形范围内的文档:
# 查询在矩形范围内的文档 min_lon, min_lat, max_lon, max_lat = 116.38, 39.87, 116.42, 39.91 # 矩形范围 query = { 'location': {'$within': {'$box': [[min_lon, min_lat], [max_lon, max_lat]]}} } cursor = db.places.find(query) for doc in cursor: print(doc)
输出结果为:
{'_id': ObjectId('...'), 'name': 'pidancode.com', 'location': [39.88, 116.4]} {'_id': ObjectId('...'), 'name': '皮蛋编程', 'location': [39.9, 116.41]} {'_id': ObjectId('...'), 'name': '北京', 'location': [39.9, 116.39]}
相关文章