class GeoRb::Point

Attributes

altitude[R]
latitude[R]
longitude[R]

Public Class Methods

new(latitude = 0.0, longitude = 0.0, altitude = 0.0) click to toggle source
# File lib/geo_rb/point.rb, line 5
def initialize(latitude = 0.0, longitude = 0.0, altitude = 0.0)
  @latitude, @longitude, @altitude = normalize_coordinates(latitude, longitude, altitude)
end

Public Instance Methods

to_h() click to toggle source
# File lib/geo_rb/point.rb, line 9
def to_h
  instance_variables.map do |var|
    [var[1..].to_sym, instance_variable_get(var)]
  end.to_h
end

Private Instance Methods

normalize_angle(x, limit) click to toggle source

Normalize angle `x` to be within `[-limit; limit)` range.

# File lib/geo_rb/point.rb, line 18
def normalize_angle(x, limit)
  double_limit = limit * 2.0
  modulo = x % double_limit
  return modulo + double_limit if modulo < -limit
  return modulo - double_limit if modulo >= limit

  modulo
end
normalize_coordinates(latitude, longitude, altitude) click to toggle source
# File lib/geo_rb/point.rb, line 27
def normalize_coordinates(latitude, longitude, altitude)
  latitude = Float(latitude)
  longitude = Float(longitude)
  altitude = Float(altitude)

  unless [latitude, longitude, altitude].all?(&:finite?)
    raise "Point coordinates must be finite. #{latitude}, #{longitude} #{altitude} has been passed as coordinates."
  end

  raise "Latitude must be in the [-90; 90] range." if latitude.abs > 90

  longitude = normalize_angle(longitude, 180.0) if longitude.abs > 180
  [latitude, longitude, altitude]
end