Module DatumConv
In: lib/jpmobile/datum_conv.rb

測地系変換モジュール

参考文献: 飛田幹男, 世界測地系と座標変換—21世紀の測量士・位置情報ユーザ・プログラマーのために, 日本測量協会, 2002.

Methods

blh2xyz   jgd2tky   tky2jgd   xyz2blh   xyz2xyz  

Constants

GRS80 = [ 6378137, 298.257222101]
Bessel = [6377397.155, 299.152813]
Tokyo97toITRF94 = [-146.414, 507.337, 680.507]
ITRF94toTokyo97 = [ 146.414,-507.337,-680.507]
Deg2Rad = Math::PI/180

Public Class methods

緯度(度),経度(度),高度(m)を三次元直交座標(m)に変換する。

[Source]

    # File lib/jpmobile/datum_conv.rb, line 15
15:   def self.blh2xyz(b_deg,l_deg,he,datum)
16:     a = datum[0].to_f
17:     f = 1.0/datum[1]
18:     b = b_deg * Deg2Rad
19:     l = l_deg * Deg2Rad
20: 
21:     e2 = f * (2 - f)
22:     n = a / Math.sqrt(1 - e2 * Math.sin(b)**2 )
23: 
24:     x = (n+he)*Math.cos(b)*Math.cos(l)
25:     y = (n+he)*Math.cos(b)*Math.sin(l)
26:     z = (n*(1-e2)+he)*Math.sin(b)
27:     return x,y,z
28:   end

世界測地系から日本測地系に変換する。

[Source]

    # File lib/jpmobile/datum_conv.rb, line 63
63:   def self.jgd2tky(b,l,he=0)
64:     x,y,z = blh2xyz(b,l,he,GRS80)
65:     x,y,z = xyz2xyz(x,y,z,ITRF94toTokyo97)
66:     b,l,he = xyz2blh(x,y,z,Bessel)
67:     return b,l,he
68:   end

日本測地系から世界測地系に変換する。

[Source]

    # File lib/jpmobile/datum_conv.rb, line 55
55:   def self.tky2jgd(b,l,he=0)
56:     x,y,z = blh2xyz(b,l,he,Bessel)
57:     x,y,z = xyz2xyz(x,y,z,Tokyo97toITRF94)
58:     b,l,he = xyz2blh(x,y,z,GRS80)
59:     return b,l,he
60:   end

三次元直交座標(m)を緯度(度),経度(度),高度(m)に変換する。

[Source]

    # File lib/jpmobile/datum_conv.rb, line 31
31:   def self.xyz2blh(x,y,z,datum)
32:     a = datum[0].to_f
33:     f = 1.0/datum[1]
34:     e2 = f * (2 - f)
35:     l = Math.atan2(y,x)
36: 
37:     p = Math.sqrt(x**2+y**2)
38:     r = Math.sqrt(p**2+z**2)
39:     u = Math.atan2(z*((1-f)+e2*a/r),p)
40:     b = Math.atan2(z*(1-f)+e2*a*Math.sin(u)**3,(1-f)*(p-e2*a*Math.cos(u)**3))
41: 
42:     he = p*Math.cos(b) + z*Math.sin(b) - a*Math.sqrt(1-e2*Math.sin(b)**2)
43: 
44:     b_deg = b / Deg2Rad
45:     l_deg = l / Deg2Rad
46:     return b_deg,l_deg,he
47:   end

三次元直交座標でシフトする。

[Source]

    # File lib/jpmobile/datum_conv.rb, line 50
50:   def self.xyz2xyz(x,y,z,d)
51:     return x+d[0],y+d[1],z+d[2]
52:   end

[Validate]