7

PostGISPOINTタイプを使用して場所の座標を格納する Rails モデルがあります。境界ボックス内に含まれるすべての場所を照会するにはどうすればよいですか? 境界ボックスは、次のように Google マップから取得されます。

/locations?within=40.766159%2C-73.989786%2C40.772781%2C-73.979905&per_page=500

私のモデルでは、これを処理するスコープがありますが、クエリを正しく取得する方法がわかりません:

scope :within, ->(box_string) {
    sw = box_string.split(",")[0..1].reverse.map {|c| c.to_f}
    ne = box_string.split(",")[2..3].reverse.map {|c| c.to_f}
    box = "BOX3D(#{sw[0]} #{sw[1]}, #{ne[0]} #{ne[1]})"
    where( ***WHAT DO I DO HERE?*** )
  }
4

1 に答える 1

7

rgeo gem の使用:

Gemfile:

gem 'rgeo'

モデル.rb:

def self.within_box(sw_lat, sw_lon, ne_lat, ne_lon)
  factory = RGeo::Geographic.spherical_factory
  sw = factory.point(sw_lon, sw_lat)
  ne = factory.point(ne_lon, ne_lat)
  window = RGeo::Cartesian::BoundingBox.create_from_points(sw, ne).to_geometry
  where("your_point_column && ?", window)
end

ファクトリpointメソッドの引数の順序は (lon, lat) であることに注意してください。

activerecord-postgis-adapterrgeo を含む gemを使用することもできます)。

于 2013-02-16T01:07:12.650 に答える