我有一个具有纬度和经度属性的位置对象,我想在数据库中查询距当前纬度/经度位置特定距离内的对象。
我读到了'geocoder' gem,它似乎能够做我正在寻找的东西,但是为了添加 obj.near 功能,我需要向对象添加地理编码。我根本不需要地理编码或反向地理编码,只需按坐标进行距离查询。
我可以在不添加任何地理编码功能的情况下将 .near 功能添加到具有“地理编码器”的对象吗?有没有其他或更好的方法来做我想做的事?
我有一个具有纬度和经度属性的位置对象,我想在数据库中查询距当前纬度/经度位置特定距离内的对象。
我读到了'geocoder' gem,它似乎能够做我正在寻找的东西,但是为了添加 obj.near 功能,我需要向对象添加地理编码。我根本不需要地理编码或反向地理编码,只需按坐标进行距离查询。
我可以在不添加任何地理编码功能的情况下将 .near 功能添加到具有“地理编码器”的对象吗?有没有其他或更好的方法来做我想做的事?
你为什么不看地理编码器源?它在 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
有一个关于 Geocoder 的 RailsCast ,据我所知,您需要在模型中添加纬度和经度,然后 gecoder 将起作用。