Geokit Rails - 查找包含其范围内的点(位置)的所有用户

时间:2013-11-12 16:10:43

标签: ruby-on-rails ruby-on-rails-4 ruby-2.0 geokit

试图了解如何使用Geokit Rails让所有覆盖特定点的用户获得覆盖范围。

例如,用户A,B,C和D的半径为i> 1。 0公里。现在让我们说我想找到覆盖用lat和lng创建的地图上选定点的所有用户。所以当我想查找某个范围内的所有记录时,问题就不是问题了,我希望找到包含我在其范围内的位置的所有记录

从图像:应该返回用户A,B,C而不是D,因为红点不在他的范围内。

我尝试过:我从上到下查看了文档,搜索了示例,但都导致查找范围内的记录,所以不是我的情况。如果有任何人有同样的事情要解决请分享。谢谢。

graphic description of the problem

2 个答案:

答案 0 :(得分:2)

我的解决方案现在有效,可能不是最好的解决方案,只是找不到任何其他方法:

  address = [lat, long]
  users.each do |u|
    if u.distance_to(address, :units => :kms) < u.distance
      tutors << t
    end
  end 

如何运作: 用户表有一个名为distance的字段,其中我保留一个整数,显示用户覆盖的半径,例如:20。 在进行搜索时,我从表单中发送lat和long params以在地图上找到位置,然后通过用户循环查找所有用户,他们之间的距离与此点之间的距离小于距离值。

例如:用户1的范围为20 km,因此距离值为20,然后检查用户1和地图上的点之间的距离是否小于20加载他的数组。

我不需要太多的用户循环,因为我在之前的代码中限制了他们的数量,所以我只得到了一些...最多1到40之间。

现在它有效,如果有人有更好的解决方案请分享。

更好的溶解:

  def find_tutors
    lat_d = Geokit::Mappable::LATITUDE_DEGREES
    km_lat = Geokit::Mappable::KMS_PER_LATITUDE_DEGREE
    kms_per_mile = Geokit::Mappable::KMS_PER_MILE

    users = User.joins(:courses).where("courses.lesson ILIKE ?", "%#{lesson}%")

    if long.present?
      users = users.where("pow((longitude - ?) * (#{lat_d} * #{kms_per_mile} * abs(cos(0.0174 * longitude))), 2) +
      pow((latitude  - ?) * #{km_lat}, 2) < pow(distance, 2)",
      long, lat)
    end

    users
  end

在上述情况下,longitudelatitude是搜索模型的属性,但也可以是任何其他属性。

答案 1 :(得分:2)

尝试使用 distance_sql 方法。

我们假设问题中的用户模型已经使用 acts_as_mappable 定义,并且有一个名为 range 的列,用于定义用户的范围(以kms为单位)。假设查询中的选定位置由名为Location的模型定义,该模型也是 acts_as_mappable

如果您有一个名为 my_location 的位置实例,那么您可以找到其范围包含该位置的所有用户,如下所示:

User.where( User.distance_sql( my_location, :kms ) + " < range" )

distance_sql 方法需要其第一个参数来响应 lat lng 方法,因此 acts_as_mappable em>很理想。如果您选择的位置只是[lat,lng]的数组,那么遗憾的是这种方法无法使用 - 您必须将它包装在响应 lat lng 方法首先。