lib/geo_units.rb in geo_units-0.2.6 vs lib/geo_units.rb in geo_units-0.3.1

- old
+ new

@@ -14,38 +14,67 @@ # @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' +require 'sweetloader' module GeoUnits - autoload_modules :Converter, :DmsConverter, :NumericExt, :Maps, :Constants, :UnitConversions, :from => 'geo_units' - - def self.included(base) - [Maps, Constants, UnitConversions].each do |module_name| + autoload_modules :Constants, :Converter, :Maps, :Numeric + + class << self + attr_accessor :default_coords_order + + def default_coords_order + @default_coords_order ||= :lng_lat + end + end + + def self.included(base) + [:Maps, :Constants, :"Converter::Units"].each do |module_name| + module_name = "GeoUnits::#{module_name.to_s.camelize}".constantize base.send :include, module_name - base.extend module_name + base.extend module_name end end def self.units - [:feet, :meters, :kms, :miles, :radians] + [:feet, :meters, :kms, :kilometers, :miles, :radians] end - 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 - } + (units - [:radians]).each do |unit_type| + define_singleton_method "#{unit_type}_to" do |unit, number = 0| + return 0 if number <= 0 + unit = normalized(unit) + + converter = GeoUnits::Maps::Meters + from = converter.from_unit[unit_type] + to = converter.to_unit[unit] + + m = number * from * to + end end + def self.radians_to unit, number, lat = 0 + unit = normalized(unit) + # factor = GeoUnits::Converter::Units.units_per_longitude_degree(lat, unit) + # puts "factor: #{factor} - #{unit}" + (GeoUnits::Maps::Earth.distance_per_latitude_degree[unit] * number.to_f) + end + module ClassMethods + def normalized unit = :km + unit = key(unit) + return :feet if feet_unit.include? unit + return :meters if meters_unit.include? unit + return :kilometers if kms_unit.include? unit + return :miles if miles_unit.include? unit + return :radians if radins_unit.include? unit + + raise ArgumentError, "Normalize unit error, unit key: #{unit}" + end + 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 @@ -74,13 +103,13 @@ [:mil, :mile, :miles] end def radians_unit [:rad, :radians] - end + end end - + extend ClassMethods -end +end require 'geo_units/core_ext'