我有一個緯度和經度屬性的位置對象,我想查詢數據庫中的距離當前緯度/經度位置特定距離內的對象。通過軌道座標距離查詢3.x
我讀到了有關'geocoder'的gem,它似乎能夠做我正在尋找的東西,但爲了添加obj.near功能,我需要將地理編碼添加到對象中。 我根本不需要地理編碼或反向地理編碼,只需通過座標進行距離查詢。
我可以在不添加任何地理編碼功能的情況下將.near功能添加到具有「geocoder」的對象嗎?有另一種或更好的方式來做我想要的嗎?
我有一個緯度和經度屬性的位置對象,我想查詢數據庫中的距離當前緯度/經度位置特定距離內的對象。通過軌道座標距離查詢3.x
我讀到了有關'geocoder'的gem,它似乎能夠做我正在尋找的東西,但爲了添加obj.near功能,我需要將地理編碼添加到對象中。 我根本不需要地理編碼或反向地理編碼,只需通過座標進行距離查詢。
我可以在不添加任何地理編碼功能的情況下將.near功能添加到具有「geocoder」的對象嗎?有另一種或更好的方式來做我想要的嗎?
你爲什麼不看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上工作
有一個RailsCast about Geocoder,從我看到你需要爲你的模型添加經度和緯度,gecoder將工作。
它不適用於爲模型添加經度和緯度.. – 2012-03-08 07:25:48
爲了有效地進行這種最接近的查詢查詢,您需要讓數據庫支持它們(通過使用索引查詢)或以某種方式準備數據以使數據庫能夠對其進行索引。所以請首先告訴我們你使用哪個DB。同樣爲了選擇最佳方法,最好知道你的項目需要什麼精度。 – cryo28 2013-07-30 12:17:13