дистанционные запросы по координатам в рельсах 3.x - PullRequest
3 голосов
/ 05 марта 2012

У меня есть объект местоположения с атрибутами широты и долготы, и я хочу запросить в базе данных объекты на определенном расстоянии от текущего местоположения широты / долготы.

Я читал о геме геокодера, который, кажется, может делать то, что я ищу, но чтобы добавить функциональность obj.near, мне нужно добавить геокодирование к объекту. Мне вообще не нужно геокодирование или обратное геокодирование, только дистанционные запросы по координатам.

можно ли добавить функцию .near к объекту с помощью 'геокодера' без добавления каких-либо функций геокодирования? Есть ли другой или лучший способ сделать то, что я хочу?

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Почему вы не смотрите на источник геокодера?Это на GitHub.Я думаю, что класс, который вы ищете, это stores / active_record.rb

Очевидно, вы не получите расширяемости или других преимуществ использования библиотеки, но это даст вам код, который выneed.

Редактировать: Это даст вам UDF в mysql, который вычислит расстояние

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

0 голосов
/ 07 марта 2012

Существует RailsCast о геокодере , из того, что я видел, вам нужно добавить широту и долготу к вашей модели, и геокодер будет работать.

...