mongodb中地理位置信息的存储和查询

1、存储数据

        在百度地图拾取器(拾取坐标系统)中获取一些经纬度的值,提前写入代码集合中。然后利用逆地理位置api接口获取数据写入mongodb中。

注意:需要提前开发者认证,得到在应用管理中获取ak。

示例代码:

import requests
from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['gps']
# print(my_col)
ak = 'duKnQ2pQCRIDADFDSTsS944SLfMvYrvw'

# gps '纬度,经度'  注意:直接从百度左边拾取器中获取的顺序为:'经度,纬度'
# 百度有自己的坐标加密方式:bd09ll
gps_set = {'40.060326,116.732761', '40.046187,116.767831', '40.008618,116.799451', '39.904198,116.675844', '40.023648,116.718388'}


def reverse_geocoding(gps, ak):
    """
    :param gps: str(lat)+','+str(lng)
    :param ak: ak
    :return:
    """
    url = 'http://api.map.baidu.com/reverse_geocoding/v3/?'
    params = {
        "location": gps,
        "output": 'json',
        "ak": ak,
        "coordtype": "bd09ll",  # 默认值
    }
    response = requests.get(url, params=params)
    return response.json()


def format_data(data):
    data_dict = {}
    # 简单数据结构的存储
    data_dict['location'] = {
        "type": "Point",
        "coordinates": [data['location']['lng'], data['location']['lat']]
    }
    data_dict['formatted_address'] = data['formatted_address']
    data_dict['others'] = data
    return data_dict


col_list = []
for i in gps_set:
    response = reverse_geocoding(i, ak)
    print(response)
    res = format_data(response['result'])
    print(res)
    col_list.append(res)
    if len(col_list) == 2:
        my_col.insert_many(col_list)
        col_list = []
if len(col_list) > 0:
    my_col.insert_many(col_list)

数据库中存储的数据如下:

mongodb中地理位置信息的存储和查询_第1张图片

注意:数据存储结构中必须包含如下类型,便于建立索引。其中type类型可以选择别的属性值。

mongodb中地理位置信息的存储和查询_第2张图片

2、创建索引

注意:要想通过地理位置进行查询,首先要建立索引,否则报错。

创建索引时,官方文档如下格式:

mongodb中地理位置信息的存储和查询_第3张图片

使用Studio 3T工具创建索引:

mongodb中地理位置信息的存储和查询_第4张图片

mongodb中地理位置信息的存储和查询_第5张图片

mongodb中地理位置信息的存储和查询_第6张图片

mongodb中地理位置信息的存储和查询_第7张图片

3、查询地理位置数据

注意:查询前必须创建索引,否则查询报错。

官方文档如下所示:

mongodb中地理位置信息的存储和查询_第8张图片

示例代码:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['gps']
# print(my_col)

query = {'location': {'$near': {
    '$geometry': {'type': "Point", 'coordinates': [116.762761, 40.060326]},
    '$minDistance': 0,
    '$maxDistance': 5000
}}}

datas = my_col.find(query)
# print(datas)
for data in datas:
    print(data)

运行结果:

mongodb中地理位置信息的存储和查询_第9张图片

mongodb中地理位置信息的存储和查询_第10张图片

详见官方文档:Geospatial Queries — MongoDB Manual

你可能感兴趣的:(Mongodb数据库,mongodb,gps)