使用Couchbase搜索给定半径内的文档

时间:2015-07-31 06:21:23

标签: python couchbase couchbase-view

我想写一个地理空间视图,该视图从给定的纬度和经度搜索半径一英里范围内的以下文档。我该怎么做?

{
   "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"
}

3 个答案:

答案 0 :(得分:3)

由于您只能使用带Couchbase空间视图的边界框查询,因此您必须将距离查询分为两个步骤:

  1. 查询Couchbase,了解与您的半径匹配的边界内的坐标。
  2. 过滤掉#1返回的坐标,这些坐标超出您指定的半径。
  3. 第一步,您需要编写如下空间视图:

    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

    或者更好的是,您可以使用地理定位库作为您选择的语言来计算边界框和距离。这是C#的一个,Java的一个。

答案 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