XYZタイルの経緯度矩形の計算

XYZタイルの経緯度矩形をRubyで計算するコードを共有します。はてなブログでうまくはてな記法が乗らないので、久しぶりにはてなダイアリーへの投稿です。
XYZタイルの仕様は、Slippy map tilenames - OpenStreetMap Wiki に記載されています。ここからロジックを抜き出して Ruby で表現するだけの簡単な作業を行ったところ、以下のような感じです。

# tile2wgs.rb CC0

def x2lng(x, n)
  360.0 * x / n - 180.0
end

def y2lat(y, n)
  rad = Math::atan(Math::sinh(Math::PI * (1 - 2.0 * y / n)))
  rad * 360.0 / (2 * Math::PI)
end

def tile2wgs(z, x, y)
  n = 2 ** z
  lngr = x2lng(x, n)..x2lng(x + 1, n)
  latr = y2lat(y + 1, n)..y2lat(y, n)
  [lngr, latr]
end

# test
p tile2wgs(2, 1, 1)

実行例

$ ruby tile2wgs.rb 
[-90.0..0.0, 0.0..85.05112877980659]

できれば、こういった完全な車輪の再発明はしたくないところですが...