0

我在 CouchDB 中有一组地理定位的文档 - 也就是说,它们的结构类似于

{
  _id: ...,
  ...
  coords: {
    lat: 45.204149214,
    long: 40.284712972
  }
}

我希望能够在地图上显示它们。这需要我在给定的方格中获取所有文件。在给定的时间间隔内很容易获得所有经度的文档:

// map function
function(doc) {
  emit(doc.coords.long, doc.other_stuff);
}

使用类似的查询

// query
/path/to/view/?startkey=40&endkey=50

问题是我看不到如何做多维约束。如何获取纬度在 2030 之间以及经度在 40 到 50 之间的所有文档?我看到我可以指定多个键,但这会结果。

一种选择是在客户端上进行进一步过滤,但考虑到数据的大小,这可能是不可行的。

免责声明:关于 SO 有几个类似的问题,基本上说明这是不可能的。由于它们看起来都过时了,我想知道最新版本的 CouchDB 是否发生了变化。

4

1 回答 1

2

你是对的,你不能做多维查询。但是有GeoCouch。通过build-couchdb添加到沙发数据库非常容易,或者您可以使用默认情况下已烘焙的 iriscouch 托管。

如您所见,使用 Geocouch相当简单,并且查询采用如下边界框:

http://localhost:5984/places/_design/main/_spatial/points?bbox=0,0,180,90

如果您不想使用 geocouch(出于某种原因),我已经成功使用了GeoHash,它将两个维度映射到一维空间。 是查看代码,这里是查询。如您所见,它没有那么优雅,但它可以跨 couchdb 版本移植,而且它也可以工作。

于 2012-05-31T17:39:27.567 回答