module Hubeny
Constants
- BESSEL_R_X
ベッセル楕円体( 旧日本測地系)
- BESSEL_R_Y
- DEG2RAD
- GRS80_R_X
GRS80(世界測地系)
- GRS80_R_Y
- RAD2DEG
- VERSION
- WGS84_R_X
WGS84(GPS)
- WGS84_R_Y
Public Class Methods
distance(lat1, lng1, lat2, lng2, algorithm: :hubeny)
click to toggle source
# File lib/hubeny.rb, line 21 def self.distance(lat1, lng1, lat2, lng2, algorithm: :hubeny) case algorithm when :hubeny return self.hubeny(lat1, lng1, lat2, lng2) when :haversine return self.haversine(lat1, lng1, lat2, lng2) else raise "Algorithm '#{algorithm}' is not implemented." end end
haversine(lat1, lng1, lat2, lng2)
click to toggle source
# File lib/hubeny.rb, line 32 def self.haversine(lat1, lng1, lat2, lng2) lat1 *= DEG2RAD lat2 *= DEG2RAD lng1 *= DEG2RAD lng2 *= DEG2RAD d1 = Math::sin(lat1) * Math::sin(lat2) d2 = Math::cos(lat1) * Math::cos(lat2) * Math::cos(lng2 - lng1) d0 = r_x * Math::acos(d1 + d2) return d0 end
hubeny(lat1, lng1, lat2, lng2)
click to toggle source
# File lib/hubeny.rb, line 43 def self.hubeny(lat1, lng1, lat2, lng2) lat1 *= DEG2RAD lat2 *= DEG2RAD lng1 *= DEG2RAD lng2 *= DEG2RAD a_x = lng1 - lng2 a_y = lat1 - lat2 p = (lat1 + lat2) / 2.0 e = Math::sqrt((r_x ** 2 - r_y ** 2) / (r_x ** 2)) w = Math::sqrt(1 - (e ** 2) * ((Math::sin(p)) ** 2)) m = r_x * (1 - e ** 2) / (w ** 3) n = r_x / w d = (a_y * m) ** 2 d += (a_x * n * Math::cos(p)) ** 2 d = Math::sqrt(d) return d end
r_x()
click to toggle source
# File lib/hubeny.rb, line 68 def self.r_x case @gcs when 0 r_x = BESSEL_R_X when 1 r_x = GRS80_R_X when 2 r_x = WGS84_R_X end return r_x end
r_y()
click to toggle source
# File lib/hubeny.rb, line 80 def self.r_y case @gcs when 0 r_y = BESSEL_R_Y when 1 r_y = GRS80_R_Y when 2 r_y = WGS84_R_Y end return r_y end