Ruby Geocoder如何设置最小距离

时间:2013-01-31 11:29:24

标签: ruby-on-rails ruby geocoding

使用Alex Reisner的Ruby Geocoder并找到.near方法非常有用。我们有一个问题是我们如何设置它以便我们可以在原点之间搜索距离x和距离y之间的对象(此时.near方法仅设置它看起来的最大距离): documentation here

我们正在寻找类似的东西:

places = Place.near("Washington", min_distance, max_distance).reorder("score")

或修改查询的某种方式,以便我们在不使用.reorder(我们用于对另一个“得分”字段进行排序)的情况下获得相同的效果

我们想要的最终结果是能够按分数排序的位置在距离原点x和y英里之间。

2 个答案:

答案 0 :(得分:1)

AFAIK本身并未实施。

如果使用ActiveRecord,您可以尝试使用Geocoder的private class methods(参见第105至147行)来推广您自己的“反向”方法,其算法应该更多或更少:

  • 使用Geocoder::Calculations#bounding_box
  • 计算最小距离查询的边界框
  • 构建SQL以查找边界框中的所有记录并使用#distance_sql(lat,lon,options)> = min_distance

将此逻辑填入where范围内,将其链接到near,然后vo!如果您感到懒惰,您甚至可以复制/粘贴整个方法,只需更改<=谓词即可。

在旁注中,在地理编码器的github上提交功能请求会很棒,因为我认为它可以很快为它们实现。

答案 1 :(得分:1)

Geocoder生成的查询包含distance列,因此您只需为最小距离添加条件,例如:

Venue.near("Washington", max_distance).having("distance >= ?", min_distance)

请注意,您需要使用HAVING,而不是WHERE