Skip to content
Snippets Groups Projects
Commit f7dec053 authored by Alex Reisner's avatar Alex Reisner
Browse files

Rename method and move to Calculations module.

parent a5dccc87
No related branches found
No related tags found
No related merge requests found
...@@ -147,6 +147,27 @@ module Geocoder ...@@ -147,6 +147,27 @@ module Geocoder
to_degrees [lat, lon] to_degrees [lat, lon]
end end
##
# Returns coordinates of the lower-left and upper-right corners of a box
# with the given point at its center. The radius is the shortest distance
# from the center point to any side of the box (the length of each side
# is twice the radius).
#
# This is useful for finding corner points of a map viewport, or for
# roughly limiting the possible solutions in a geo-spatial search
# (ActiveRecord queries use it thusly).
#
def bounding_box(latitude, longitude, radius, options = {})
units = options[:units] || :mi
radius = radius.to_f
[
latitude - (radius / latitude_degree_distance(units)),
longitude - (radius / longitude_degree_distance(latitude, units)),
latitude + (radius / latitude_degree_distance(units)),
longitude + (radius / longitude_degree_distance(latitude, units))
]
end
## ##
# Convert degrees to radians. # Convert degrees to radians.
# If an array (or multiple arguments) is passed, # If an array (or multiple arguments) is passed,
......
...@@ -172,9 +172,10 @@ module Geocoder::Orm ...@@ -172,9 +172,10 @@ module Geocoder::Orm
def default_near_scope_options(latitude, longitude, radius, options) def default_near_scope_options(latitude, longitude, radius, options)
lat_attr = geocoder_options[:latitude] lat_attr = geocoder_options[:latitude]
lon_attr = geocoder_options[:longitude] lon_attr = geocoder_options[:longitude]
b = Geocoder::Calculations.bounding_box(latitude, longitude, radius, options)
conditions = \ conditions = \
["#{lat_attr} BETWEEN ? AND ? AND #{lon_attr} BETWEEN ? AND ?"] + ["#{lat_attr} BETWEEN ? AND ? AND #{lon_attr} BETWEEN ? AND ?"] +
coordinate_bounds(latitude, longitude, radius) [b[0], b[2], b[1], b[3]]
if obj = options[:exclude] if obj = options[:exclude]
conditions[0] << " AND #{table_name}.id != ?" conditions[0] << " AND #{table_name}.id != ?"
conditions << obj.id conditions << obj.id
...@@ -187,21 +188,6 @@ module Geocoder::Orm ...@@ -187,21 +188,6 @@ module Geocoder::Orm
:conditions => conditions :conditions => conditions
} }
end end
##
# Get the rough high/low lat/long bounds for a geographic point and
# radius. Returns an array: <tt>[lat_lo, lat_hi, lon_lo, lon_hi]</tt>.
# Used to constrain search to a (radius x radius) square.
#
def coordinate_bounds(latitude, longitude, radius, units = :mi)
radius = radius.to_f
[
latitude - (radius / Geocoder::Calculations.latitude_degree_distance(units)),
latitude + (radius / Geocoder::Calculations.latitude_degree_distance(units)),
longitude - (radius / Geocoder::Calculations.longitude_degree_distance(latitude, units)),
longitude + (radius / Geocoder::Calculations.longitude_degree_distance(latitude, units))
]
end
end end
## ##
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment