class Geodesy::Destination

Attributes

bearing[R]
distance[R]
radius[R]
starting_point[R]

Public Class Methods

new(starting_point, bearing, distance) click to toggle source

StartingPoint is a Coordinate Object Bearing is a Float Object Distance is an Integer or Float Object - default units: meters

# File lib/geodesy/destination.rb, line 16
def initialize(starting_point, bearing, distance)
  @starting_point = starting_point
  @radius         = Geodesy::EARTH_RADIUS
  @bearing        = bearing
  @distance       = distance
end

Public Instance Methods

calculate() click to toggle source
# File lib/geodesy/destination.rb, line 23
def calculate
  angular_distance    = distance / radius
  bearing_to_radians  = bearing.to_radians
  lat_radians         = starting_point.lat.to_radians
  lng_radians         = starting_point.lng.to_radians

  x = Math.asin(
                  ( Math.sin(lat_radians) * Math.cos(angular_distance) ) +
                  ( Math.cos(lat_radians) * Math.sin(angular_distance) * Math.cos(bearing_to_radians) )
                )
  y = lng_radians + Math.atan2(
                               Math.sin(bearing_to_radians) * Math.sin(angular_distance) * Math.cos(lat_radians),
                               Math.cos(angular_distance) - Math.sin(lat_radians) * Math.sin(x)
                               )
  # normalize y to -180°..+180°
  z = ( y + 3 * Math::PI ) % ( 2 * Math::PI ) - Math::PI

  Coordinates.new( x.to_degrees, z.to_degrees )
end