代码之家  ›  专栏  ›  技术社区  ›  JoshReedSchramm

在rails中查找距离已知点X英里的记录

  •  1
  • JoshReedSchramm  · 技术社区  · 15 年前

    我有一个表,其中包含许多记录及其long/lat坐标。我正在尝试执行常见的“显示X英里内的所有内容”类型的搜索,其中我的原点是用户当前使用浏览器中的地理位置拉取的long/lat。

    有没有人知道一种有效的方法来计算我的出发点和各种潜在目的地之间的距离,而不必从数据库中检索所有目的地并循环通过它们来计算距离?当我们在潜在的目的地表中得到越来越多的记录时,这似乎是非常低效的。

    如果有一个面向ruby/rails的解决方案非常棒,否则任何建议都将不胜感激。

    4 回复  |  直到 15 年前
        2
  •  2
  •   Geoff Lanotte    15 年前

      def self.within_distance(miles, from_longitude, from_latitude)
        self.scoped(:conditions => ["((DEGREES(ACOS(SIN(RADIANS(:from_latitude)) *
                                    SIN(RADIANS(latitude)) + 
                                    COS(RADIANS(:from_latitude)) *
                                    COS(RADIANS(latitude)) * 
                                    COS(RADIANS(:from_longitude - longitude))))) * 69.09) < :miles", 
                                    {:from_longitude => from_longitude, :from_latitude => from_latitude, :miles => miles}])
      end
    

    我希望你能免去把这个或类似的东西放进去的痛苦,但到目前为止,它像一个魅力。

        3
  •  1
  •   Steve Weet    15 年前

    然后,您可以查看一些可用于向Rails添加GIS支持的gem。 Geokit 这就是一个例子。

        4
  •  0
  •   Russell Borogove    15 年前

    如果您的数据库不支持空间数据,优化搜索的一个简单方法是计算一个带有“网格正方形”坐标的表—设置任意网格分辨率,例如10英里,找出每条记录所在的网格正方形,并存储该信息。然后查询可以说“where grid\u x>”5和网格\u x<=7和网格\u y>=13和网格\u y<=15“让服务器进行粗略过滤,然后计算客户端的实际距离。