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'