使用轨道中已知点的X英里查找记录

时间:2010-07-10 18:17:40

标签: ruby-on-rails geolocation

我有一个表格,其中包含许多带有长/纬坐标的记录。我正在尝试执行常见的“在X英里内显示全部”类型搜索,其中我的起源点是用户在浏览器中使用地理位置拉出的当前长/拉特。

有没有人知道如何有效地计算我的原点与各种潜在目的地之间的距离,而无需从数据库中检索所有目的地并循环计算距离?这似乎是非常低效的,因为我们在潜在目的地表中获得越来越多的记录。

如果有一个ruby / rails orient解决方案很棒,否则任何建议都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

如果您的数据库支持空间数据,请务必使用它。我喜欢geokit,但我需要根据空间数据进行查询,而不是全部选择并通过GIS进行过滤。我们正在运行SQL Server 2005,它不支持空间数据(2008年)。这就是我必须要做的事情:

  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

我希望你能够免除这种或类似的东西的痛苦,但到目前为止它已经像一个魅力。

答案 1 :(得分:1)

您应该查看所选数据库的空间扩展,Postres和Mysql都支持这些扩展。

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

答案 2 :(得分:1)

查看有关rails的Thinking sphinx搜索插件:http://freelancing-god.github.com/ts/en/geosearching.html

答案 3 :(得分:0)

如果您的数据库不支持空间数据,优化搜索的一个直接可能性是计算具有“网格方块”坐标的表格 - 设置任意网格分辨率,例如10英里,找出哪个网格方块每条记录都在,并存储该信息。然后查询可以说“where grid_x&gt; = 5和grid_x&lt; = 7 and grid_y&gt; = 13&grid_y&lt; = 15”,让服务器进行粗略过滤,然后计算客户端的实际距离。