Googleマップの緯度経度⇒ピクセルの変換式

卓上戸田恵梨香 2010年 カレンダー
GMap2.fromLatLngToDivPixelに対応すると思われる関数です.
Google Maps APIでは,緯度経度が画像上のどの座標に対応するかを計算する関数として,fromLatLngToDivPixelメソッドが用意されています.しかしこのメソッドはJava Scriptからしか扱えないため,それ以外のプログラム言語からでは利用が困難です.

そこで緯度経度とピクセルとの関係を数点でピックアップして,自分で変換式を推定してみました.

例えばこんなとき便利です.

  • Google Maps Static APIで取得した画像に半透過PNGを重ねたいとき
  • ピクセル上における2点間の距離を調べたいとき.
  • お母さんからホメてもらいたいとき


Rubyのプログラムです.緯度経度などの値を自分で指定してください.

#地図中央の緯度と経度
CLAT = 35.683714; CLNG = 139.487286
#地図の縦横幅
WIDTH = 600; HEIGHT = 400
#地図の倍率(0-19)
ZOOM = 10

#変換したい緯度と経度
lat = 35.658587; lng = 139.745425

#fromLatLngToDivPixel
x = (0.709505*(2**ZOOM)*(lng-CLNG) + WIDTH/2).round
y = (-40.743664*(2**ZOOM)*(Math.asinh(Math.tan(lat*Math::PI/180)) - Math.asinh(Math.tan(CLAT*Math::PI/180))) + HEIGHT/2).round


数式であらわすと,こんなかんじ.


メルカトル図法であるため,縦軸は緯度をasinh(tanφ)で変換してから用いるのが味噌のようです.まちがっていると思われた場合は,ぜひフィードバックをお願いします.係数を手計算で算出したので精度が不明確ですが,日本国内ではうまく変換できます.(緯度経度に不連続のある国外ではこの関数が利用できない可能性があります.)

参考までにここでも同様の議論がされています.