module Swissgrid::WGS84

Constants

SCALE
X_BERN
Y_BERN

Projection centre Bern

Public Class Methods

from_ch1903(a_point) click to toggle source

Converts a WGS84 point to a CH1903 point.

@param a_point [List] the WGS84 point to be converted. @return [List] the converted WGS84 point as CH1903 point.

# File lib/swissgrid/wgs84.rb, line 16
def self.from_ch1903(a_point)
  y, x , z = a_point
  y_prime = (y - Y_BERN) / SCALE.to_f
  x_prime = (x - X_BERN) / SCALE.to_f

  # compute CH1903 point
  convert(y_prime, x_prime, z)
end

Private Class Methods

convert(y_prime, x_prime, h_prime) click to toggle source

Computes the CH1903 point by means of the auxiliary parameters y', x' and height h'.

@param y_prime [Float] auxiliary parameter y'. @param x_prime [Float] auxiliary parameter x'. @param h_prime [Float] height h.

# File lib/swissgrid/wgs84.rb, line 35
def self.convert(y_prime, x_prime, h_prime)
  lambda_prime = [
      2.6779094,
      4.728982 * y_prime,
      0.791484 * y_prime * x_prime,
      0.1306 * y_prime * (x_prime ** 2),
      -0.0436 * (y_prime ** 3)
  ].reduce(:+)

  phi_prime = [
      16.9023892 ,
      3.238272 * x_prime,
      -0.270978 * (y_prime ** 2),
      -0.002528 * (x_prime ** 2),
      -0.0447 * (y_prime ** 2) * x_prime,
      -0.0140  * (x_prime ** 3)
  ].reduce(:+)

  z = if h_prime.nil? # if nil do nothing
        h_prime
      else
        [
            h_prime + 49.55,
            -12.60 * y_prime,
            -22.64 * x_prime
        ].reduce(:+)
      end

  lat, lon = [phi_prime, lambda_prime].map { |v| v * 100/36.to_f }
  z.nil? ? [lat, lon] : [lat, lon, z] # if z is nil, remove z component
end