diff --git a/lib/geocoder/calculations.rb b/lib/geocoder/calculations.rb index ed9f89c2d9bc02ea18a67cb427a56cb545ed7312..bef26fae2afab9949b30a9275a184e6e714ebae2 100644 --- a/lib/geocoder/calculations.rb +++ b/lib/geocoder/calculations.rb @@ -10,12 +10,6 @@ module Geocoder # COMPASS_POINTS = %w[N NE E SE S SW W NW] - ## - # Radius of the Earth, in kilometers. - # Value taken from: http://en.wikipedia.org/wiki/Earth_radius - # - EARTH_RADIUS = 6371.0 - ## # Conversion factor: multiply by kilometers to get miles. # @@ -31,6 +25,16 @@ module Geocoder # DEGREES_PER_RADIAN = 57.2957795 + ## + # Radius of the Earth, in kilometers. + # Value taken from: http://en.wikipedia.org/wiki/Earth_radius + # + EARTH_RADII = {km: 6371.0} + EARTH_RADII[:mi] = EARTH_RADII[:km] * KM_IN_MI + EARTH_RADII[:nm] = EARTH_RADII[:km] * KM_IN_NM + + EARTH_RADIUS = EARTH_RADII[:km] # TODO: deprecate this constant (use `EARTH_RADII[:km]`) + # Not a number constant NAN = defined?(::Float::NAN) ? ::Float::NAN : 0 / 0.0 @@ -45,7 +49,6 @@ module Geocoder # Distance spanned by one degree of latitude in the given units. # def latitude_degree_distance(units = nil) - units ||= Geocoder.config.units 2 * Math::PI * earth_radius(units) / 360 end @@ -54,7 +57,6 @@ module Geocoder # This ranges from around 69 miles at the equator to zero at the poles. # def longitude_degree_distance(latitude, units = nil) - units ||= Geocoder.config.units latitude_degree_distance(units) * Math.cos(to_radians(latitude)) end @@ -75,10 +77,6 @@ module Geocoder # Use Geocoder.configure(:units => ...) to configure default units. # def distance_between(point1, point2, options = {}) - - # set default options - options[:units] ||= Geocoder.config.units - # convert to coordinate arrays point1 = extract_coordinates(point1) point2 = extract_coordinates(point2) @@ -207,12 +205,11 @@ module Geocoder def bounding_box(point, radius, options = {}) lat,lon = extract_coordinates(point) radius = radius.to_f - units = options[:units] || Geocoder.config.units [ - lat - (radius / latitude_degree_distance(units)), - lon - (radius / longitude_degree_distance(lat, units)), - lat + (radius / latitude_degree_distance(units)), - lon + (radius / longitude_degree_distance(lat, units)) + lat - (radius / latitude_degree_distance(options[:units])), + lon - (radius / longitude_degree_distance(lat, options[:units])), + lat + (radius / latitude_degree_distance(options[:units])), + lon + (radius / longitude_degree_distance(lat, options[:units])) ] end @@ -234,10 +231,6 @@ module Geocoder # Use Geocoder.configure(:units => ...) to configure default units. # * <tt>:seed</tt> - The seed for the random number generator def random_point_near(center, radius, options = {}) - - # set default options - options[:units] ||= Geocoder.config.units - random = Random.new(options[:seed] || Random.new_seed) # convert to coordinate arrays @@ -269,7 +262,6 @@ module Geocoder # which returns a [lat,lon] array # def endpoint(start, heading, distance, options = {}) - options[:units] ||= Geocoder.config.units radius = earth_radius(options[:units]) start = extract_coordinates(start) @@ -320,12 +312,10 @@ module Geocoder end def distance_to_radians(distance, units = nil) - units ||= Geocoder.config.units distance.to_f / earth_radius(units) end def radians_to_distance(radians, units = nil) - units ||= Geocoder.config.units radians * earth_radius(units) end @@ -355,12 +345,7 @@ module Geocoder # Use Geocoder.configure(:units => ...) to configure default units. # def earth_radius(units = nil) - units ||= Geocoder.config.units - case units - when :km; EARTH_RADIUS - when :mi; to_miles(EARTH_RADIUS) - when :nm; to_nautical_miles(EARTH_RADIUS) - end + EARTH_RADII[units || Geocoder.config.units] end ## @@ -418,4 +403,3 @@ module Geocoder end end end -