【问题标题】:distance queries by coordinates in rails 3.xrails 3.x中的坐标距离查询
【发布时间】:2012-03-22 10:40:50
【问题描述】:

我有一个具有纬度和经度属性的位置对象,我想在数据库中查询距当前纬度/经度位置特定距离内的对象。

我读到了'geocoder' gem,它似乎能够做我正在寻找的事情,但是为了添加 obj.near 功能,我需要向对象添加地理编码。 我根本不需要地理编码或反向地理编码,只需按坐标查询距离即可。

我可以在不添加任何地理编码功能的情况下将 .near 功能添加到具有“地理编码器”的对象吗?有没有其他或更好的方法来做我想做的事?

【问题讨论】:

  • 为了有效地进行此类最近邻查询,您需要让数据库支持它们(通过使用索引查询)或以某种方式准备数据以使数据库能够对其进行索引。所以请先告诉我们您使用的是哪个数据库。此外,要选择最佳方法,最好知道您的项目需要什么精度。

标签: ruby-on-rails ruby-on-rails-3 rails-geocoder


【解决方案1】:

您为什么不查看地理编码器源?它在 github 上。我想你要找的课程是stores/active_record.rb

显然,您不会获得使用库的可扩展性或其他好处,但这将为您提供所需的代码。

编辑:这会给你一个 mysql 中的 UDF 来计算距离

DROP FUNCTION IF EXISTS calculateDistance; 
delimiter |
CREATE FUNCTION calculateDistance (originLatitude FLOAT, originLongitude FLOAT, targetLatitude FLOAT, targetLongitude FLOAT) 
returns FLOAT
deterministic
BEGIN
DECLARE radianConversion FLOAT;
DECLARE interim FLOAT;
DECLARE earthRadius FLOAT;

SET radianConversion = 180 / pi() ;/*57.2957795130823;*/
SET interim = SIN(originLatitude/radianConversion) * SIN(targetLatitude/radianConversion) + COS(originLatitude/radianConversion) * COS(targetLatitude/radianConversion) * COS(targetLongitude/radianConversion - originLongitude/radianConversion);

IF interim > 1 THEN
    SET interim = 1;
ELSEIF interim < -1 THEN
    SET interim = -1;
END IF;
SET earthRadius = 6371.0072;
RETURN earthRadius * ACOS(interim);
END|
delimiter ;

select calculateDistance(43.6667,-79.4167,45.5000,-73.5833);

然后你只需要从你的类的方法中传递正确的值来让它触发。显然这不适用于 Sqlite

【讨论】:

    【解决方案2】:

    有一个RailsCast about Geocoder,据我所知,您需要在模型中添加纬度和经度,gecoder 才能工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 2022-08-15
      • 1970-01-01
      • 2018-02-15
      • 2023-03-08
      • 2016-11-06
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多