查询CouchDB获取一定半径内的poi

query CouchDB to get poi within a certain radius

我想用一些兴趣点创建一个 CouchDB 数据库。 是否有 way/query 从给定的 lat/long 位置获取特定半径(比如 50 米)内的兴趣点?

我看到了一个扩展 https://github.com/couchbase/geocouch ,但这意味着我必须重新编译 CouchDB,但目前我没有管理员权限来执行此操作。

解决了,做了一个map函数:

function (doc) {

// Leidse plein
latitude = 52.3648111;
longitude = 4.8810906;

distance = Math.acos(
  Math.sin(doc.latitude * Math.PI / 180) * 
  Math.sin(latitude * Math.PI / 180) 
  + 
  Math.cos(doc.latitude * Math.PI / 180) * 
  Math.cos(latitude * Math.PI / 180) * 
  Math.cos((doc.longitude - longitude) * Math.PI / 180)) * 6371;

  // all poi's within 5km radius
  if(distance <= 5 ) {
      emit([doc.title,doc.latitude,doc.longitude], distance);
  }

 }

我有一个针对您的用例的替代方案。建议使用geohashes

您可以将文档中的位置存储为 geohash。 geohash 的长度取决于您要存储的精度。

假设您存储了大约 150 米进动的位置。在这种情况下,您将拥有 7 个字符的 geohash,例如 'gbsukp7'。检查 this 进行测试。

那么你的map函数可以这样重新定义:

function (doc) {
 emit([doc.geohash.substr(0,4), /* 39.1km × 19.5km bounding box */
      doc.geohash.substr(0,5), /* 4.89km ×  4.89km bounding box */
      doc.geohash.substr(0,6), /* 1.22km ×  0.61km bounding box */
      doc.geohash /* 153m × 153m bounding box */
      ],null)
}

通过这种方法,您可以使用一种简单的机制来获取位于与参考点相同的边界框中的文档。

它并不完美,但可以作为一种选择