2009-10-07 4 views
7

私のRailsアプリケーションから既存のPostGISデータベースを使用する必要があります。これまではDBにアクセスできましたが、GeoRubyは 'geom'カラムをPointオブジェクトに変換します。RailsからPostGIS空間データにアクセスする

私が探しているのは、これらのテーブルでActiveRecordのようなクエリを実行する簡単な方法です。

Poi.find_within_radius(...) 

または距離計算などの類似の空間クエリです。 al。

ジオキットとレールプラグインの組み合わせをいくつか試しましたが、ルビー/レールの世界にはもっと良いものがあるはずです。何かヒント?

答えて

6

はあなたがポイントでメソッドを使用することができ、距離の計算のために、あなたのポイモデル

SRID = 4326 #WGS84 

# geometry column is geom 
# pt is a GeoRuby Point 
def self.find_within_radius(pt, dist = 0.01) 
    self.all :conditions => "ST_DWithin(geom, ST_GeomFromText('POINT(#{pt.x} #{pt.y})', #{SRID}), #{dist})" 
end 

に入れGeoRubyを、持っているので

dist_circle = poi1.geom.spherical_distance(poi2.geom) 
dist_projected = poi1.geom.euclidean_distance(poi2.geom) 
+0

サンプルの集まりをありがとう、私はそれらを試してみて、彼らは魅力のように動作します!今私はもう少し研究をするための出発点を持っています(私の場合は...) – Lakitu

0

のST_Distanceを()は、おそらくあなたを意味していないオブジェクトPostgisテンプレートを作成していないか、テンプレートが存在する場合はPostgisテンプレートを使用してデータベースを作成していません。

1

synecdoche's answerに追加すると、Rails 3ではActiveRelationスコープを使用できます。これにより、クエリを連鎖させることができます。

未テスト:

# Poi.rb 

scope :within, proc { |point, distance| 
    p = "POINT(#{point.x} #{point.y})" 
    where("ST_DWithin(geom, ST_GeomFromText('#{p}', #{SRID}), #{distance})") 
} 

scope :rated, proc { |rating| where(rating: rating) } 

用途:

home = Point.new(5,5) 
Poi.rated(5).within(home, 25) 

あなたがチェーンのスコープをしない場合でも、それはクラスのメソッドを使用するよりはましだほとんどの時間。

関連する問題