如何在RethinkDB中计算地理空间查询的距离?

时间:2015-10-01 16:53:36

标签: rethinkdb

我正在尝试运行一个允许我过滤特定文档的查询,然后检查存储在那里的坐标与我传入的新坐标之间的距离。

我试过这个:

r.db('food').table('fruits')
  .hasFields(['origin', 'region'])
  .filter({region: 'North America'})
  .pluck('gpsLocation')
  .distance(r.point(37.759056, 105.015018))

但我收到此错误:e: Expected type DATUM but found SEQUENCE:

从文档中我看到我需要

geometry.distance(geometry[, {geoSystem: 'WGS84', unit: 'm'}])

但我不确定如何让我的查询返回。 gpsLocationfruits表的索引,如果这会产生影响。

1 个答案:

答案 0 :(得分:0)

你不能pluck索引。我认为您的意思是field,因为您希望使用pluck提取该字段的数据。然后从该字段创建具有相同名称的索引。如果我的假设是正确的,下面是我的答案。如果没有,您需要更新您的问题,因为您无法获取索引。

问题是数据类型错误。根据{{​​3}},命令语法看起来像这样:

geometry.distance(geometry[, {geoSystem: 'WGS84', unit: 'm'}]) → number
r.distance(geometry, geometry[, {geoSystem: 'WGS84', unit: 'm'}]) → number

这意味着distance可以调用r,传递两个geometyr对象,或调用geometry对象,并传递另一个几何对象作为其第一个参数

您的查询返回了一个STREAM。您可以通过阅读API文档找到其数据类型,或者只使用typeOf

r.db('food').table('fruits')
  .hasFields(['origin', 'region'])
  .filter({region: 'North America'})
  .pluck('gpsLocation')
  .typeOf()

因此,您必须以某种方式遍历STREAM,并在流文档上调用distance

r.db('food').table('fruits')
  .hasFields(['origin', 'region'])
  .filter({region: 'North America'})
  .pluck('gpsLocation')
  .map(function(location) {
    return location.distance(r.point(37.759056, 105.015018))
  })

它有点类似于你有一个数组,并在JavaScript中调用map来遍历数组,并在元素上运行回调函数。虽然在这里,map函数在服务器上运行。

假设您gpsLocation字段包含geometry对象,例如具有经度和纬度的点(https://rethinkdb.com/api/javascript/distance/)。