質問

Railsアプリケーションから既存のPostGISデータベースを使用する必要があります。これまでのところ、DBにアクセスすることができます。Georubyは「Geom」列をポイントオブジェクトにうまく変換します。

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

Poi.find_within_radius(...)

または距離計算などの同様の空間クエリアル。

Geokitの組み合わせをいくつか試しましたが、Railsプラグインに付随していますが、Ruby/Railsの世界にはもっと良いものがなければならないと確信しています。ヒントはありますか?

役に立ちましたか?

解決

Georubyを持っているので、POIモデルに入れてください

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

距離計算には、ポイントオブジェクトでメソッドを使用できます

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

他のヒント

追加 Synecdocheの答え, 、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)

スコープをチェーンしなくても、ほとんどの場合、クラスメソッドを使用するよりも優れています。

st_distance()は、おそらくポストGISがインストールされていないか、ポストGISテンプレートを作成しなかったことを意味しません...または、テンプレートが存在する場合、ポストGISテンプレートを使用してデータベースを作成しませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top