2013-01-11 10 views
7

Ich habe ein Rails-Modell, das einen PostGIS POINT Typ verwendet, um die Koordinaten eines Ortes zu speichern. Wie kann ich alle Orte abfragen, die in einem Begrenzungsrahmen enthalten sind? Der Begrenzungsrahmen kommt von Google Maps dies mag:Finden Sie alle Artikel innerhalb einer Bounding-Box mit PostGIS und Rails

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

dann in meinem Modell ich einen Umfang haben, dies zu umgehen, kann aber nicht herausfinden, wie die Abfrage richtig zu machen:

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

Antwort

5

Mit dem RGEO Juwel:

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 

Beachten Sie, dass das Argument, um für die Fabrik point Methode (lon, lat).

Sie können das activerecord-postgis-adapter Juwel, das RGEO enthält) verwenden.

+0

Wie wäre es ohne 'Quietschen'? – Avishai

Verwandte Themen