2012-03-04 16 views
3

私は緯度と経度の属性を持つロケーションオブジェクトを持っており、現在の緯度/経度の位置から特定の距離内にあるオブジェクトのデータベースを照会します。距離のクエリを座標軸でレール3.x

私が探しているものを行うことができるように思われる 'ジオコーダー'宝石については読んだが、obj.near機能を追加するために、オブジェクトにジオコーディングを追加する必要がある。 私はジオコーディングや逆ジオコーディングを必要としません。

ジオコーディング機能を追加せずに.jear機能をオブジェクトに「geocoder」で追加できますか?私が欲しいものをやるための別の方法や良い方法はありますか?

+0

このような最寄りのネイバーブのクエリを効率的に行うには、(インデックス付きクエリを使用して)データベースでそれらをサポートするか、またはDBにインデックスを作成できるようにデータを準備する必要があります。だから、どのDBを使用するかまず教えてください。また、最良のアプローチを選択するには、プロジェクトに必要な正確さを知っておくと良いでしょう。 – cryo28

答えて

1

なぜジオコーダのソースを見ないのですか?それはgithub上にある。あなたが探しているクラスはstores/active_record.rb

です。明らかに、ライブラリを使用すると拡張性やその他の利点は得られませんが、必要なコードが得られます。

編集:これはあなたのオフ発射し、これを取得するために

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); 

は、次に、あなたは自分のクラスにメソッドから正しい値を渡す必要が距離を計算しますMySQLでUDFを与えるだろう。明らかにこれはSqliteでは機能しません

0

あなたのモデルに緯度と経度を追加する必要があると私が見たことから、RailsCast about Geocoderがあります。

+0

モデルに緯度と経度を追加するだけでは機能しません。 –

関連する問題