Ruby Geocoder如何设置最小距离

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

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

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

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

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

AFAIK它不是原生实现的。

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

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

将这个逻辑填充到where范围内,将它链接到near ,然后vo! 如果你觉得懒惰,你甚至可以复制/粘贴整个方法,只需更改<=谓词。

另外,在地理编码器的github上提交function请求会很棒,因为我认为它可以快速实现。

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

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

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