在MongoDB中使用Python进行地理空间查询

2023-04-15 00:00:00 查询 空间 地理

首先需要安装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]}

相关文章