・なんだかよくわからない計算式をこねくり回すおはなし
MOBACのプロファイル作成用スクリプトをMOBAC任せから自前で作成できるタイプに作り直すにあたって、xmlに保存されている数値が何なのか理解する必要がある。どうやら緯度経度情報そのままではなく、マップタイルの位置を示すものであるようなので、「google map タイル」で検索してみる。トップに表示されたGoogleのデベロッパー向けぽいページに
それらしき記述がある。
とりあえず1枚のタイルが256x256で、それが縦横(2のズームレベル乗)枚敷き詰められているということはわかった。Lv19だと、縦横それぞれ(2^19*256 = 134217728)ピクセルの大きな画像ということになる。MOBACで一番右下のタイルを選択したときの値134217472~134217727というのにも一致する。他のLvでもそのようだ。「じゃあ、まあなんとかなるか」と適当に考えサイトを後にする。
まずは札幌周辺の N=43.16125 , W=141.21423 , E=141.47937 , S=42.96755 Lv16 で計算してみて一致するか確認しよう。MOBACで作成済みのデータによると14982143/6167039~14969600/6154240あたりの数値になるはずである。
タイルは左上から数えるが、MOBACで使う座標は原点が真ん中にあるので、原点を左上にそろえてやる。W,Eは180を足してやり、N,Sはそれぞれ85.051129までしかないので、85.051129から引いた値にする。こんな計算式でいいかなと計算してみる。
tileN = floor((85.051129-43.16125)/170.102258*(2^16))*256 = 4131584
tileW = floor((141.21423+180)/360*(2^16))*256 = 14969600
tileE = ceil((141.47937+180)/360*(2^16))*256-1 = 14982143
tileS = ceil((85.051129-42.96755)/170.102258*(2^16))*256-1 = 4150783
※ floorは切り捨て、ceilは切り上げ
tileWとtileEは一致するけど、tileNとtileSがかすりもしない……つまり上下方向には線形的に考えてはいけないということか。そういえばメルカトル図法ってそういうものだって地理で習ったような(笑)
メルカトル図法でぐぐってみる。こういうときは
Wikipediaだろう。「特長」の項目には、いつか聞いたことのあるようなことが長々と説明されている。まあ、これを読めば↑みたいな計算式で座標が求まる訳がないのはわかる。さすがに浅はかすぎた…
「投影法の表式」という項目にそれっぽい計算式が書かれている。y=ln tan(π/4+φ/2)という式が使えそうだ。というか、こんな式自力で導き出せるわけがなかった(笑)
試行錯誤しながらそれっぽい式を作って確認してみる。↓はAHK用の記述
pi := 3.14159265358979
Lv := 16
tileN := Floor(((1-Ln(Tan((N/2+45)*pi/180))/pi)/2)*2**Lv)*256
tileW := Floor((W+180)/360*2**Lv)*256
tileE := Ceil((E+180)/360*2**Lv)*256-1
tileS := Ceil(((1-Ln(Tan((S/2+45)*pi/180))/pi)/2)*2**Lv)*256-1
tileN = 6154240 , tileW = 14969600 , tileE = 14982143 , tileS = 6167039 となりMOBACで作ったデータと一致する。数カ所、数種類のLvで確認してみたが正しく計算できてるようだ。
どうやらプロファイルの自前作成の糸口がつかめたので次回で2号機完成と使用結果について書いてみることにする。