diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index b4d46f25d18c6bda921c7491d2ca87b3fd2c5a5a..2a9076ce07f9672920d4c1b5785a41b244a6ca99 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -39,6 +39,25 @@ module Geocoder::Store where(:id => false) # no results if no lat/lon given end } + + + ## + # Find all objects within the area of a given bounding box. + # Bounds must be an array of locations specifying the southwest + # corner followed by the northeast corner of the box + # (<tt>[[sw_lat, sw_lon], [ne_lat, ne_lon]]</tt>). + # + scope :within_bounding_box, lambda{ |bounds| + sw_lat, sw_lng, ne_lat, ne_lng = bounds.flatten if bounds + return where(:id => false) unless sw_lat && sw_lng && ne_lat && ne_lng + spans = "latitude BETWEEN #{sw_lat} AND #{ne_lat} AND " + spans << if sw_lng > ne_lng # Handle a box that spans 180 + "longitude BETWEEN #{sw_lng} AND 180 OR longitude BETWEEN #{ne_lng} and -180" + else + "longitude BETWEEN #{sw_lng} AND #{ne_lng}" + end + { :conditions => spans } + } end end