Module: GeoDelta::Projector

Defined in:
lib/geodelta/projector.rb

Constant Summary collapse

DEG2RAD =

度をラジアンに変換するための係数

Math::PI / 180.0
RAD2DEG =

ラジアンを度に変換するための係数

180.0 / Math::PI
DELTA_HEIGHT =

一辺を1.0とする正三角形の高さ

Math.sqrt(0.75)

Class Method Summary collapse

Class Method Details

.lat_to_my(lat) ⇒ Object

緯度をメルカトルY座標に変換する

-90.0 <= lat <= +90.0
 -1.0 <= my  <=  +1.0


12
13
14
# File 'lib/geodelta/projector.rb', line 12

def self.lat_to_my(lat)
  return Math.atanh(Math.sin(lat * DEG2RAD)) / Math::PI
end

.lat_to_ny(lat) ⇒ Object



67
68
69
# File 'lib/geodelta/projector.rb', line 67

def self.lat_to_ny(lat)
  return self.my_to_ny(self.lat_to_my(lat))
end

.latlng_to_nxy(lat, lng) ⇒ Object



83
84
85
86
87
88
# File 'lib/geodelta/projector.rb', line 83

def self.latlng_to_nxy(lat, lng)
  return [
    self.lng_to_nx(lng),
    self.lat_to_ny(lat),
  ]
end

.lng_to_mx(lng) ⇒ Object

経度をメルカトルX座標に変換する

-180.0 <= lng <= +180.0
  -1.0 <= mx  <=   +1.0


19
20
21
# File 'lib/geodelta/projector.rb', line 19

def self.lng_to_mx(lng)
  return lng / 180.0
end

.lng_to_nx(lng) ⇒ Object



71
72
73
# File 'lib/geodelta/projector.rb', line 71

def self.lng_to_nx(lng)
  return self.mx_to_nx(self.lng_to_mx(lng))
end

.mx_to_lng(mx) ⇒ Object

メルカトルX座標を経度に変換する

  -1.0 <= mx  <=   +1.0
-180.0 <= lng <= +180.0


33
34
35
36
37
# File 'lib/geodelta/projector.rb', line 33

def self.mx_to_lng(mx)
  mx  = (mx % 2.0) - 2.0
  mx += 2.0 if mx < -1.0
  return mx * 180.0
end

.mx_to_nx(mx) ⇒ Object

メルカトルX座標から正規化X座標に変換する

 -1.0 <= my <=  +1.0
-12.0 <= ny <= +12.0


49
50
51
# File 'lib/geodelta/projector.rb', line 49

def self.mx_to_nx(mx)
  return mx * 12.0
end

.my_to_lat(my) ⇒ Object

メルカトルY座標を緯度に変換する

 -1.0 <= my  <=  +1.0
-90.0 <= lat <= +90.0


26
27
28
# File 'lib/geodelta/projector.rb', line 26

def self.my_to_lat(my)
  return Math.asin(Math.tanh(my * Math::PI)) * RAD2DEG
end

.my_to_ny(my) ⇒ Object

メルカトルY座標から正規化Y座標に変換する

 -1.0 <= my <=  +1.0
-12.0 <= ny <= +12.0


42
43
44
# File 'lib/geodelta/projector.rb', line 42

def self.my_to_ny(my)
  return my / DELTA_HEIGHT * 12.0
end

.nx_to_lng(nx) ⇒ Object



79
80
81
# File 'lib/geodelta/projector.rb', line 79

def self.nx_to_lng(nx)
  return self.mx_to_lng(self.nx_to_mx(nx))
end

.nx_to_mx(ny) ⇒ Object

正規化X座標からメルカトルX座標に変換する

-12.0 <= ny <= +12.0
 -1.0 <= my <=  +1.0


63
64
65
# File 'lib/geodelta/projector.rb', line 63

def self.nx_to_mx(ny)
  return ny / 12.0
end

.nxy_to_latlng(nx, ny) ⇒ Object



90
91
92
93
94
95
# File 'lib/geodelta/projector.rb', line 90

def self.nxy_to_latlng(nx, ny)
  return [
    self.ny_to_lat(ny),
    self.nx_to_lng(nx),
  ]
end

.ny_to_lat(ny) ⇒ Object



75
76
77
# File 'lib/geodelta/projector.rb', line 75

def self.ny_to_lat(ny)
  return self.my_to_lat(self.ny_to_my(ny))
end

.ny_to_my(my) ⇒ Object

正規化Y座標からメルカトルY座標に変換する

-12.0 <= ny <= +12.0
 -1.0 <= my <=  +1.0


56
57
58
# File 'lib/geodelta/projector.rb', line 56

def self.ny_to_my(my)
  return my / 12.0 * DELTA_HEIGHT
end