RailsからのポストGIS空間データへのアクセス
-
20-09-2019 - |
質問
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テンプレートを使用してデータベースを作成しませんでした。
所属していません StackOverflow