3

緯度と経度の属性を持つ場所オブジェクトがあり、現在の緯度/経度の場所から特定の距離内にあるオブジェクトをデータベースに照会したいと考えています。

私が探していることを実行できるように見える「ジオコーダー」宝石について読みましたが、obj.near 機能を追加するには、オブジェクトにジオコーディングを追加する必要があります。ジオコーディングや逆ジオコーディングはまったく必要ありません。座標による距離クエリだけです。

ジオコーディング機能を追加せずに、「geocoder」を使用して .near 機能をオブジェクトに追加できますか? 私がやりたいことを行うための別の方法またはより良い方法はありますか?

4

2 に答える 2

1

ジオコーダーのソースを見てみませんか? 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では機能しません

于 2012-03-06T06:28:28.900 に答える
0

Geocoder に関する RailsCastがあります。私が見たところ、モデルに緯度と経度を追加する必要があり、gecoder が機能します。

于 2012-03-07T08:01:02.143 に答える