2013-01-11 19 views
7

Mam model Rails, który używa typu PostGIS POINT do przechowywania współrzędnych lokalizacji. Jak mogę zapytać o wszystkie lokalizacje zawarte w ramce ograniczającej? Obwiednia pochodzi z Google Maps za słuszne:Znajdź wszystkie elementy w ramce ograniczającej za pomocą PostGIS i Railsów

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

następnie w moim modelu mam zakres do obsługi tego, ale nie można dowiedzieć się, jak uzyskać prawo zapytanie:

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?***) 
    } 

Odpowiedz

5

Używanie RGEO gEM:

Gemfile:

gem 'rgeo' 

model.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 

Zauważ, że kolejność argumentów dla metody jest fabrycznie point (dł, szer).

Możesz chcieć użyć klejnotu activerecord-postgis-adapter, który zawiera rgeo).

+0

Co powiecie na pytanie bez 'squeel'? – Avishai