lib/geo_units.rb in geo_units-0.2.4.1 vs lib/geo_units.rb in geo_units-0.2.5

- old
+ new

@@ -14,184 +14,47 @@ # @param [String|Number] Degrees or deg/min/sec in variety of formats # @returns [Number] Degrees as decimal number # @throws ArgumentError require 'sugar-high/numeric' +require 'sugar-high/class_ext' module GeoUnits - autoload :Converter, 'geo_units/converter' - autoload :DmsConverter, 'geo_units/dms_converter' - autoload :NumericExt, 'geo_units/numeric_ext' - - def earth_radius_map - { - :miles => 3963.1676, - :kilometers => 6378.135, - :meters => 6378135, - :feet => 20925639.8 - } + autoload_modules :Converter, :DmsConverter, :NumericExt, :Maps, :Constants, :UnitConversions, :from => 'geo_units' + + def self.included(base) + [Maps, Constants, UnitConversions].each do |module_name| + base.send :include, module_name + base.extend module_name + end end - def earth_major_axis_radius_map - { - :miles => 3963.19059, - :kilometers => 6378.137, - :meters => 6378137, - :feet => 20925646.36 - } + def self.units + [:feet, :meters, :kms, :miles, :radians] end - def earth_minor_axis_radius_map - { - :kilometers => 6356.7523142, - :miles => 3949.90276, - :meters => 6356752.3142, - :feet => 20855486.627 + units.each do |unit| + class_eval %{ + def self.#{unit}_to unit, number = 0 + return 0 if number <= 0 + unit = key(unit) + m = number / GeoUnits::Maps.meters_map[:#{unit}] + m * GeoUnits::Maps.meters_map[unit] + end } end - - def radians_per_degree - Math::PI / 180.0 - end - # Haversine Formula - # Adapted from Geokit Gem - # https://github.com/andre/geokit-gem.git - # By: Andre Lewis - def pi_div_rad - 0.0174 - end - - def kms_per_mile - 1.609 - end - - def meters_per_feet - 3.2808399 - end - - def miles_per_latitude_degree - 69.1 - end - - def kms_per_latitude_degree - miles_per_latitude_degree * kms_per_mile - end - - def latitude_degrees - earth_radius_map[:miles] / miles_per_latitude_degree - end - - def degrees_to_radians(degrees) - degrees.to_f * radians_per_degree - end - - def units_sphere_multiplier(units) - units = GeoUnits.key units - earth_radius_map[units] - end - - def units_per_latitude_degree(units) - units = GeoUnits.key units - GeoUnits.radian_multiplier[units] - end - - def units_per_longitude_degree(lat, units) - miles_per_longitude_degree = (latitude_degrees * Math.cos(lat * pi_div_rad)).abs - units = GeoUnits.key units - case units - when :feet - miles_per_longitude_degree * kms_per_mile * 1000 * meters_per_feet - when :meters - miles_per_longitude_degree * kms_per_mile * 1000 - when :kms - miles_per_longitude_degree * kms_per_mile - when :miles - miles_per_longitude_degree - end - end - module ClassMethods def key unit = :km unit = unit.to_sym methods.grep(/_unit$/).each do |meth| return meth.to_s.chomp('_unit').to_sym if send(meth).include? unit end raise ArgumentError, "Unknown unit key: #{unit}" end - def units - [:feet, :meters, :kms, :miles, :radians] - end - def all_units [:miles, :mile, :kms, :km, :feet, :foot, :meter, :meters, :radians, :rad] - end - - [:feet, :meters, :kms, :miles, :radians].each do |unit| - class_eval %{ - def #{unit}_to unit, number = 0 - return 0 if number <= 0 - unit = key(unit) - m = number / GeoUnits.meters_map[:#{unit}] - m * meters_map[unit] - end - } - end - - def earth_radius units - units = GeoUnits.key units - GeoUnits.earth_radius_map[units] - end - - def radians_per_degree - 0.017453293 # PI/180 - end - - def radians_ratio units - units = GeoUnits.key units - radians_per_degree * earth_radius[units] - end - - def precision - { - :feet => 0, - :meters => 2, - :kms => 4, - :miles => 4, - :radians => 4 - } - end - - # from mongoid-geo, as suggested by niedhui :) - def radian_multiplier - { - :feet => 364491.8, - :meters => 111170, - :kms => 111.17, - :miles => 69.407, - :radians => 1 - } - end - - def meters_multiplier - { - :feet => 0.305, - :meters => 1, - :kms => 6371, - :miles => 3959, - :radians => 111170 - } - end - - def meters_map - { - :feet => 3.2808399, - :meters => 1, - :kms => 0.001, - :miles => 0.00062137, - :radians => 0.00000899 - } end protected def feet_unit