地図移動させる場合の緯度経度計算について
まさに文系SE/PGの弱点がまざまざと…
Google Static Maps API(v1/V2)を使う際、やはりGoogle Maps APIのように地図がスクロールできないのがネックとなる。
そこで、移動後の緯度経度を計算して、リンクを作ることになるのだが…
サンプルに…というか、参考になりそうなところをあれこれ探してみた。
Google Static Maps APIを使ってPHPで携帯に、スクロール出来る地図を表示する。 ネットに花を咲かせましょう。 会社作りました。
ここにあるのはhttp://www.polyarc.us/adjust.js*1をPHPに置き換えたもの。
$offset=268435456;
これって意味不明と思ったら、Google Maps関連の英語のblogでも同じような数字を使ってた。
2の28乗だっけ?
Chief Technical Officer - Google Static Mapsの画像サイズと経度・緯度
ここにはこんな式が出てくる。
[東へ移動したときの中心経度]=
Chief Technical Officer - Google Static Mapsの画像サイズと経度・緯度
(180 + [元の中心経度] - [画像幅] / 256 * 180 / 2^[ズームレベル]) mod 360 - 180
[南へ移動したときの中心緯度]=
(90 + [元の中心緯度] - [画像高さ] / 256 * 85 / 2^[ズームレベル]) mod 180 - 90
さらにこんなのも見つけた。
ケンタローの開発日記: Google Static Maps API で表示域の範囲を求める方法
//地図尺度 $myzoom=13; //中心座標 $mylat=36.060923; $mylng=136.500556; //出力画像サイズに合わせて画像の端から端の距離を以下のように求めます。 //端から端の距離(latlng単位) = 画像幅 / ( 2^地図尺度 ) //サイズ 240x180 pow:PHPのべき算 $langex=240/pow(2,$myzoom); $langey=180/pow(2,$myzoom); // 以下の結果を1000000分の1で丸め処理して下さい。 // 中心点に距離を加算して表示地図のレンジを算出します。 //丸め関数を用意しましょう $lattop = round(($mylat + $langey/2)*1000000)/1000000; $latbtm = round(($mylat - $langey/2)*1000000)/1000000; $lngtop = round(($mylng + $langex/2)*1000000)/1000000; $lngbtm = round(($mylng - $langex/2)*1000000)/1000000;ケンタローの開発日記: Google Static Maps API で表示域の範囲を求める方法
実際には表示されている範囲を求めて、その範囲内のマーカーをデータベースから拾っているようです。
最後の二つを比較して試してみたけど、実感としては、最後のケンタローの開発日記: Google Static Maps API で表示域の範囲を求める方法がシンプルだし、いいかな?
Chief Technical Officer - Google Static Mapsの画像サイズと経度・緯度の計算式をPHPに置き換えてみたけど(間違っているかもしれない)、南北と東西の移動幅の差がちょっと気になった。試したズームレベルによって誤差が出ているのかもしれないが…
他にも情報があれば、誰かコメントとか欲しい(けど、誰かにこれを読まれている気がしない)。
これも距離検索と同様、Google本体から情報が出ないかなぁ?
そもそもIPで制限がガッチリあるから、ケータイでバチバチ移動されても困るから、実装の必要はなかったりするのかな?
*1:直リン注意