class Geodesics::Strategies::Lambert

Constants

CENTRAL_ANGLE
EQUATORIAL_RADIUS
FLATTENING
INVERSE_FLATTENING

Public Class Methods

new( equatorial_radius: EQUATORIAL_RADIUS, flattening: FLATTENING, central_angle: CENTRAL_ANGLE ) click to toggle source
# File lib/geodesics/strategies/lambert.rb, line 13
def initialize(
  equatorial_radius: EQUATORIAL_RADIUS,
  flattening: FLATTENING,
  central_angle: CENTRAL_ANGLE
)
  @equatorial_radius = equatorial_radius
  @flattening = flattening
  @central_angle = central_angle
end

Public Instance Methods

distance(point1, point2) click to toggle source
# File lib/geodesics/strategies/lambert.rb, line 23
def distance(point1, point2)
  sigma = @central_angle.call(point1, point2)
  beta1 = parametric_latitude(point1.latitude)
  beta2 = parametric_latitude(point2.latitude)
  p = (beta1 + beta2) / 2
  q = (beta2 - beta1) / 2
  x = (sigma - sin(sigma)) * sin(p)**2 * cos(q)**2 / cos(sigma / 2)**2
  y = (sigma + sin(sigma)) * cos(p)**2 * sin(q)**2 / sin(sigma / 2)**2
  @equatorial_radius * (sigma - @flattening * (x + y) / 2)
end

Private Instance Methods

cos(radian) click to toggle source
# File lib/geodesics/strategies/lambert.rb, line 45
def cos(radian)
  v = Math.cos(radian)
  v < 1e-10 ? 1e-10 : v
end
parametric_latitude(latitude) click to toggle source
# File lib/geodesics/strategies/lambert.rb, line 36
def parametric_latitude(latitude)
  Math.atan((1 - @flattening) * Math.tan(latitude))
end
sin(radian) click to toggle source
# File lib/geodesics/strategies/lambert.rb, line 40
def sin(radian)
  v = Math.sin(radian)
  v < 1e-10 ? 1e-10 : v
end