2012-03-04 57 views
3

我有一個緯度和經度屬性的位置對象,我想查詢數據庫中的距離當前緯度/經度位置特定距離內的對象。通過軌道座標距離查詢3.x

我讀到了有關'geocoder'的gem,它似乎能夠做我正在尋找的東西,但爲了添加obj.near功能,我需要將地理編碼添加到對象中。 我根本不需要地理編碼或反向地理編碼,只需通過座標進行距離查詢。

我可以在不添加任何地理編碼功能的情況下將.near功能添加到具有「geocoder」的對象嗎?有另一種或更好的方式來做我想要的嗎?

+0

爲了有效地進行這種最接近的查詢查詢,您需要讓數據庫支持它們(通過使用索引查詢)或以某種方式準備數據以使數據庫能夠對其進行索引。所以請首先告訴我們你使用哪個DB。同樣爲了選擇最佳方法,最好知道你的項目需要什麼精度。 – cryo28 2013-07-30 12:17:13

回答

1

你爲什麼不看geocoder的來源?它在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上工作

0

有一個RailsCast about Geocoder,從我看到你需要爲你的模型添加經度和緯度,gecoder將工作。

+0

它不適用於爲模型添加經度和緯度.. – 2012-03-08 07:25:48