关于在Python中基于地理位置查询Cloudant数据库的建议
Cloudant 地理不一致性
我刚接触 IBM Cloudant CouchDB,想要查询我上传并标记了 GPS 坐标的记录。
我希望能够查询到距离某个位置 100 公里以内的所有记录。
但是,Cloudant 网站上关于地理查询的信息有些不一致。
比如:
页面上仍然说地理查询处于测试阶段(但客服说不是):tinyurl DOT com SLASH mkcyur2
示例中缺少表格(可能是因为我自动选择的位置附近没有数据)?tinyurl DOT com SLASH lvxlb4q
API 参考文档没有提到地理查询(发布时地理查询还没上线):https://cloudant.com/wp-content/uploads/Cloudant-API-Reference.pdf
地理查询可能只对特定客户开放?https://cloudant.com/blog/announcing-cloudant-geospatial/#.U6wiqRYRpNN
这是我用 Python 插入带有 GPS 和时间的地理标记记录的方法。
import requests
import json
auth = ('username', 'password')
headers = {'Content-type': 'application/json'}
doc = r.json()
doc['event_title'] = "Blah"
doc['event_datetime_utc_epoch'] = 1403768195000
doc['event_lat'] = -31.089675
doc['event_lon'] = 150.932309
post_url = "https://account.cloudant.com/database".format(auth[0])
r = requests.post( post_url, auth=auth, headers=headers, data=json.dumps(doc) )
print json.dumps(r.json(), indent=1)
这是我用 Python 查询 10 条记录的方法。
import requests
import json
auth = ('username', 'password')
get_url = "https://account.cloudant.com/database/_all_docs?limit=10".format(auth[0])
r = requests.get(get_url, auth=auth)
print json.dumps(r.json(), indent=1)
我希望能够查询到我附近(100 公里半径)和在某个时间之后(记录保存日期的 30 分钟内)的所有记录?
1 个回答
Cloudant有一个地理信息系统(GIS)查询层,叫做Cloudant Geo,目前这个功能只对特定客户开放。如果你联系他们的支持团队,可能可以申请试用期。
另外,Cloudant Search也提供了一些有限的地理空间查询功能,主要是通过Lucene实现的。你可以根据距离某个点来排序搜索结果,还可以进行边界框查询。现在来看,这似乎是最适合你的选择(不过这并不是真正的圆形搜索)。
我建议你可以使用类似下面的搜索功能:
function(doc) {
index('event_lat', doc.event_lat);
index('event_lon', doc.event_lon);
index('event_datetime', doc.event_datetime_utc_epoch);
}
然后再进行类似下面的查询:
https://account.cloudant.com/database/_design/myddoc/_search/mysearch?q=event_lat:[10 to 30] AND event_lon:[140 TO 160] AND event_datetime:[1403768195000 TO Infinity]&sort="<distance,event_lon,event_lat,15,150,mi>"