查询CouchDB以获取特定半径内的poi

查询CouchDB以获取特定半径内的poi,couchdb,point-of-interest,Couchdb,Point Of Interest,我想用一些POI创建一个CouchDB数据库。 是否有方法/查询从给定的横向/纵向位置获取特定半径(比如50米)内的poi 我看到了一个扩展,但这意味着我必须重新编译CouchDB,但目前我没有管理员权限来执行此操作。解决了它并生成了一个映射函数: function (doc) { // Leidse plein latitude = 52.3648111; longitude = 4.8810906; distance = Math.acos( Math.sin(doc.latitud

我想用一些POI创建一个CouchDB数据库。 是否有方法/查询从给定的横向/纵向位置获取特定半径(比如50米)内的poi


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

解决了它并生成了一个映射函数:

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);
  }

 }
功能(doc){
//莱德斯普莱因
纬度=52.3648111;
经度=4.8810906;
距离=Math.acos(
Math.sin(doc.latitude*Math.PI/180)*
Math.sin(纬度*Math.PI/180)
+ 
Math.cos(doc.latitude*Math.PI/180)*
Math.cos(纬度*Math.PI/180)*
Math.cos((doc.longitude-longitude)*Math.PI/180))*6371;
//5公里半径范围内的所有poi

如果(距离我对您的用例有一个备选方案。该方案是使用

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

让我们考虑你用大约150米进动来存储这个位置。在这种情况下,你会有7个字符的GeHASH,比如'GBSKP7'。检查测试。

然后可以通过以下方式重新定义映射函数:

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)
}
使用这种方法,您可以使用一种简单的机制来获取位于与参照点相同的边界框中的文档


它不是完美的,但可能是一个选项

我不认为你可以绕过Geococock的需要。也许如果你安装了Docker,你可以用Geocock获得Docker映像并以这种方式运行。嗯..我过去在PHP/Mysql中习惯于这样做:这可以转换为CouchDB查询吗?我很好奇,你需要的
6371
常量值是多少是相乘吗?以k为单位的地球半径是值
纬度=52.3648111;
经度=4.8810906;
始终不变吗?您不需要更改它们吗?我仍在计算;)。当我有一个工作示例时,将在这里发布是的,所以刚刚计算出来,map函数不接受自定义GET uri变量:(所以我不能设置中心点嗯..但我不知道如何动态设置方框。我的意思是,这就像一个应用程序,可以获取方框内的poi,所以每次我都需要提供方框数据。所以方框不是硬编码的。哦,等等..我刚刚意识到..我可以计算中心点geohash并将其发送到视图。然后在我的同事中uchDB我已经有了计算过的geohash的文档,然后匹配,您不需要计算中心点,只需按照您需要的精度将参考位置编码为geohash。然后在视图筛选中使用它:…?startkey=[“gbsu”]&endkey=[“gbsu”,{}]是的..这就是我的意思:)