class MassInvite::Location

Location class

Constants

EARTH_RADIUS_IN_KM
LAT_LONG_REGEX
RAD_PER_DEG

Attributes

lat[R]
long[R]

Public Class Methods

new(lat, long) click to toggle source
# File lib/mass_invite/location.rb, line 27
def initialize(lat, long)
  self.lat = lat
  self.long = long
end

Public Instance Methods

distance_from(location) click to toggle source
# File lib/mass_invite/location.rb, line 32
def distance_from(location)
  distance(location)
end
lat=(value) click to toggle source
# File lib/mass_invite/location.rb, line 44
def lat=(value)
  @lat = validate_lat(value)
end
lat_in_rad() click to toggle source
# File lib/mass_invite/location.rb, line 36
def lat_in_rad
  @lat * RAD_PER_DEG
end
long=(value) click to toggle source
# File lib/mass_invite/location.rb, line 48
def long=(value)
  @long = validate_long(value)
end
long_in_rad() click to toggle source
# File lib/mass_invite/location.rb, line 40
def long_in_rad
  @long * RAD_PER_DEG
end

Private Instance Methods

distance(loc) click to toggle source
# File lib/mass_invite/location.rb, line 54
def distance(loc)
  # Delta, converted to rad
  dlat_rad = (loc.lat - @lat).abs * RAD_PER_DEG
  dlon_rad = (loc.long - @long).abs * RAD_PER_DEG

  a = Math.sin(dlat_rad / 2)**2 + Math.cos(lat_in_rad) *
                                  Math.cos(loc.lat_in_rad) *
                                  Math.sin(dlon_rad / 2)**2
  d = 2 * Math.asin(Math.sqrt(a))

  # Delta in km
  EARTH_RADIUS_IN_KM * d
end
validate_lat(value) click to toggle source
# File lib/mass_invite/location.rb, line 68
def validate_lat(value)
  lat = case value
        when String
          unless value =~ LAT_LONG_REGEX
            raise ArgumentError, 'Latitude is not valid.'
          end

          value.to_f
        when Float
          value
        else
          raise ArgumentError, 'Latitude should be a float/string value.'
        end

  raise ArgumentError, 'Latitude is not valid.' if lat > 90.0 || lat < -90.0

  lat
end
validate_long(value) click to toggle source
# File lib/mass_invite/location.rb, line 87
def validate_long(value)
  long = case value
         when String
           unless value =~ LAT_LONG_REGEX
             raise ArgumentError, 'Longitude is not valid.'
           end

           value.to_f
         when Float
           value
         else
           raise ArgumentError, 'Longitude should be a float/string value.'
         end

  if long > 180.0 || long < -180.0
    raise ArgumentError, 'Longitude is not valid.'
  end

  long
end