我想写一个地理空间视图,该视图从给定的纬度和经度搜索半径一英里范围内的以下文档。我该怎么做?
{
"agree_allowed":true,
"assigned_by":"",
"assigned_to":"",
"comments_allowed":true,
"location": {
"coordinates": [
"-74.168868",
"40.854655"
],
"type": "Point"
},
"subscribed":{
"user_cfd29b81f0263a380507":true,
"user_cfd29b81f0263a3805010":true
},
"type":"report",
"user_id":"user_cfd29b81f0263a380507",
"username":"test17"
}
答案 0 :(得分:3)
由于您只能使用带Couchbase空间视图的边界框查询,因此您必须将距离查询分为两个步骤:
第一步,您需要编写如下空间视图:
function(doc, meta)
{
if (doc.location)
emit(doc.location, [meta.id, doc.location]);
}
注意:这是视图的Couchbase 3.0版本,在Couchbase 4中,您不再需要在值中发出meta.id和doc.location。
现在,给定起点(lat,lon)和半径 r ,您需要计算一个边界框 [lat1,lon1,lat2,lon2 ] 查询视图,查找其坐标可能落在所需半径范围内的文档列表。 Couchbase中的边界框查询指定了左下角和右上角坐标。
接下来,在您的应用程序中,迭代所有结果并检查它们是否确实落在起点的R距离内。
根据您需要的准确度,您可以假设地球是平坦的,只是在2D平面上进行计算,这对于1英里的距离来说是不准确的,但并非如此。或者,使用实际准确的公式来计算所有内容,如本文中所述:http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
答案 1 :(得分:1)
查看Couchbase中的GeoSpatial视图文档:http://docs.couchbase.com/4.0/views/spatial-views.html
您可以采取的一种方法是使用围绕其位置的1英里边界框索引所有文档。
然后,您将查询该视图,其中start_range和end_range是相同的范围,这只是上面文档的位置。这将返回所有文档,其中该点位于其1英里的边界框内。
您可以使用GeoJSON获得更精确的边界框,遗憾的是它们在规格中没有圆圈,因此根据您制作边界框的高级程度,您可以获得距离查询不到一英里的结果位置。
答案 2 :(得分:0)
对于空间视图,您只能按边界框进行搜索。
您可能想在半径范围内搜索-隐藏在全文搜索中... https://docs.couchbase.com/server/current/fts/fts-geospatial-queries.html