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

Python 使用Couchbase搜索给定半径内的文档,python,couchbase,couchbase-view,Python,Couchbase,Couchbase View,我想编写一个地理空间视图,在给定纬度和经度的一英里半径内搜索以下文档。我该怎么做 { "agree_allowed":true, "assigned_by":"", "assigned_to":"", "comments_allowed":true, "location": { "coordinates": [ "-74.168868", "40.854655" ], "type": "Point" }, "

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

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

查看Couchbase中的地理空间视图文档:

您可以采取的一种方法是在所有文档的位置周围使用一个1英里的边界框对其进行索引

然后,您将查询该视图,开始范围和结束范围是相同的范围,这将是上面文档的位置。这将返回点位于其1英里边界框内的所有文档


您可以使用GeoJSON来创建更精确的边界框,不幸的是,它们在规格中没有圆,因此根据您创建边界框的高级程度,您可能会得到距离查询位置不到一英里的结果。

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

  • 查询Couchbase中与半径匹配的边界框内的坐标
  • 过滤掉#1返回的超出指定半径的坐标 对于第一步,您需要编写一个空间视图,如下所示:

    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的范围内

    根据您需要的精度,您可以假设地球是平的,只需在二维平面上进行计算,这将是不准确的,但对于1英里的距离来说并非如此。或者,使用实际精确的公式来计算一切,如本篇优秀文章所述:


    或者更好的是,您可以使用所选语言的地理位置库来计算边界框和距离。这里有一个用于和一个用于。

    对于空间视图,您只能通过边界框进行搜索

    您可能希望在半径范围内搜索-在全文搜索中隐藏。。。

    您的意思是要解决以下问题:给定两对(纬度、经度)坐标,计算距离?或者我理解错了吗?我想写一个地理空间视图,它返回距离为1英里的报告作为参考,请参阅关于使用地理空间API的Python文档:注意,在Couchbase中指定边界框的顺序实际上是
    lon,lat
    而不是
    lat,lon
    @David:-谢谢你的解释,但是我能得到任何用代码解释的链接吗?所以我必须写一个查询,从couchbase获取所有的lat,lon,然后用python编写一个代码来过滤radius,对吗?我如何用一个1英里的边界框来索引文档?