FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

グーグルマップ(Google Maps) の座標間変換式について(1)



Google Maps APIで使用する地図の座標系間の変換式について調べてみた。
本記事で扱う座標系は、地図の世界測地系(緯度・経度)、内部的に用いられるピクセル座標、生成された画像の画像座標、の3つである(座標系の詳細は後述)。


本記事の構成は以下のとおり。

  1. はじめに

  2. 座標系間の変換式を示す。

  3. 変換式が有効であることを、Google Static Maps APIで実際に確かめる。

  4. 本記事とは別の変換式(adjust.js)についてコメントする。


1.はじめに

Google Static Maps APIを用いると、表示したい場所のパラメータを指定したURLをブラウザに入力するだけでその場所の地図を表示することができる。下記例は東京駅周辺の地図。
例えば、東京を中心とした地図を描きたい場合には、次のURLを入力すればよい。

http://maps.google.com/maps/api/staticmap?center=35.680909,139.767372&zoom=14&size=200x200&sensor=false




なお、パラメータは「?」以降に指定し、意味は次のとおりである。centerは表示したい場所の経度・緯度であり、この地点を中心とする地図が表示される。zoomはズームレベルで値が大きいほど拡大された地図が表示される。sizeは画像のサイズである。
URLパラメータの詳細についてはStatic Maps API V2 デベロッパー ガイドを参照されたい。

このようにGoogle Static Maps APIを用いると地図(画像)を表示でき、単に地図を表示するだけであればこれで十分である。しかし、生成された地図画像の情報をもとに何らかのアプリケーションを作成することを考えた場合、これだけの情報では不十分であることがわかる。例えば、地図画像(例えば、画像サイズ:256x256)の四隅の緯度・経度を求めることは案外厄介だ。

そこで必要になるのが、世界測地系(緯度・経度)のある地点と、この地点が表示される画像の場所を関連付ける変換式である。この変換式を用いれば、緯度・経度と画像上の位置を自由に変換できるため、Google Static Maps APIを用いた色々なアプリケーションを開発することができる。

そこで本記事では、座標系間の変換式、すなわち、世界測地系・ピクセル座標・画像座標間の変換式について記述する。

変換式についてはRgoogleMapsのドキュメントを参考にした。

2.世界測地系・ピクセル座標・画像座標の変換式について

まずは、Google Maps APIのドキュメント
Google Maps JavaScript API V3 オーバーレイから関連部分を抜粋する。

わかりやすくするため、ピクセル座標(下記を参照してください)の計算では、ズーム レベル 0 の地図がベース タイル サイズの 1 つのタイルであると仮定します。次に、緯度と経度をこのベース タイルのピクセルの位置に変換する投影を使用して、ピクセル座標に相対的な世界座標を定義します。
(中略)
Google Maps の世界座標はメルカトル図法の原点(地図の北西の隅、経度 180 度、緯度約 85 度)から測定され、x の方向は東(右)に、y の方向は南(下)に増加します。Google Maps の基本メルカトル タイルは 256x256 ピクセルなので、使用できる世界座標の空間は {0-256}, {0-256} です(下記を参照)。
(中略)
ズーム レベル 19 では、地図上の x および y ピクセルはそれぞれ、0~256 * 219 の値を使用して参照されます。


本記事はこのドキュメントを基本として、変換式を導いていく。

その前に、本記事に出てくる3つの座標系の定義を簡単に述べておく(下図参照)。


世界測地系
ある地点を緯度経度で表す座標系。Google Static Maps APIに経緯度を指定する。
例えば東京を中心とする地図を表示したい場合、緯度:36度、経度:140度をAPIのcenter引数に指定する。

ピクセル座標
Google Map内部で用いられ、ある地点をピクセルで表す時に用いる座標系。ズームレベルに依存して座標の縮尺が変わる。通常は意識しない座標系。
経度:180 度、緯度:約85度がこの座標の原点。

画像座標
ブラウザ上に表示された画像の座標系。本記事では原点は画像の中心とする。マーカーが画像の中心から何ピクセル離れているか指定するための座標系。「画像座標」は造語なので他では通用しない。
Google Static Maps API(size引数)にこの画像のサイズを指定する。



下図の上半分が世界測地系、下半分がピクセル座標。ピクセル座標の内部に描かれているのが画像座標。


世界測地系・ピクセル座標・画像座標


本記事で用いる記号について、ここでまとめて定義しておく。


$z$
ズームレベルのことで、Google Static Maps APIのzoom引数に指定する。ズームレベルを大きくするとより詳細な地図が表示される。

$(x_c, y_c)$
Google Static Maps APIの引数(center)で指定する経緯度で、この点を中心とした地図が表示される。変換式においては、この点が暗黙的な基準点になる。本記事では、この点が画像座標の原点に変換されるように変換式を求める。

$(x, y)$
マーカーの経緯度。この点(任意)に対して世界測地系・ピクセル座標・画像座標の間の変換式を導く。

$(p, q)$
マーカーのピクセル座標内での位置。世界測地系のマーカー$(x, y)$はこの点に変換(写像)される。

$(X, Y)$
マーカーの画像座標内での位置。この変数は画像座標の位置であるが、別の見方をすると、画像の中心からの何ピクセル数離れているかを意味する変位と解釈できることに注意。世界測地系の経緯度$(x, y)$が画像座標のこの変位に変換される。

$L$
Google Mapsで表示可能な緯度の最大値(定数)。$L$は約85度。Google Maps APIではこの地点より北極側は表示できない。南極も同様。




準備が整ったのでこれから下記の変換式をそれぞれ導いていく。後半の4つの変換式を求めることが目標であり、前半の4変換式は後半を求めるための準備である。

  • 世界測地系の経度$x$からピクセル座標の位置$p$への変換式

  • 世界測地系の緯度$y$からピクセル座標の位置$q$への変換式

  • ピクセル座標の位置$p$から世界測地系の経度$x$への変換式

  • ピクセル座標の位置$q$から世界測地系の緯度$y$への変換式

  • 世界測地系の経度$x$から画像座標の縦方向変位$X$への変換式

  • 世界測地系の緯度$y$から画像座標の縦方向変位$Y$への変換式

  • 画像座標の横方向変位$X$から世界測地系の経度$x$への変換式

  • 画像座標の縦方向変位$Y$から世界測地系の緯度$y$への変換式





●世界測地系の経度$x$から、ピクセル座標の位置$p$への変換式
$$ \begin{align}
p(x, z) &= 2^{z+7}\left(\frac{x}{180}+1\right) \hspace{1cm}\cdots (1)
\end{align}$$

●世界測地系の緯度$y$から、ピクセル座標の位置$q$への変換式

$$ \begin{align}
q(y, z) &= \frac{2^{z+7}}{\pi}\left(-\frac{1}{2}\ln\frac{1+\sin(\frac{\pi}{180}y)}{1-\sin(\frac{\pi}{180}y)}+\frac{1}{2}\ln\frac{1+\sin(\frac{\pi}{180}L)}{1-\sin(\frac{\pi}{180}L)}\right)\\
&= \frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right) \hspace{1cm}\cdots (2)
\end{align}$$
ここで、次の関係を用いて式変形した。
$$ \begin{align}
\tanh^{-1}(x) = \frac{1}{2}\ln \left(\frac{1+x}{1-x}\right), |x|<1
\end{align}$$
ちなみに、$\tanh^{-1}(x)$は逆双曲線正接(アークハイパボリックタンジェント)、$\ln$は$e$を底とする対数。また、$\frac{\pi}{180}y$となっているのは、$y$度をラジアンに変換するためである。

ところで、Google Maps JavaScript API V3 オーバーレイによると、
・ズームレベルを0にして地図を表示すると、256x256ピクセルの画像に地球全体の地図が表示される。
・ズームレベル 19 では、ピクセル座標上の p および q ピクセルはそれぞれ、0~256 * 219 の値を使用して参照される。

先に進む前に、変換式(1)および(2)がこの記述を満たすことを示しておく。

まず、ズームレベルがzの場合、式(1)より経度-180度および180度の地点はピクセル座標$p$の0及び256 * 2zに変換されることを示す。
$$ \begin{align}
p(x=-180, z) &= 2^{7+z}\left(\frac{-180}{180}+1\right)\\
&= 0\\
p(x=180, z) &= 2^{7+z}\left(\frac{180}{180}+1\right)\\
&= 256*2^z\\
\end{align}$$

同様に、ズームレベルがzの場合、式(2)より緯度$L$度および$-L$度の地点はピクセル座標$q$の0及び256 * 2zに変換されることを示す。
$$ \begin{align}
q(y=L, z) &= \frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right)\\
&= 0\\
q(y=-L, z) &= \frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(-\frac{\pi}{180}L\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right)\\
&= \frac{2^{z+8}}{\pi}\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\\
&= 256*2^z\\
\end{align}$$

上の式に$z=0$および$z=19$を代入すれば上記Google Maps JavaScript API V3 オーバーレイの記述を満たすことがすぐにわかる。


なお、式の変形には次の関係がなりたすことを用いている。
$$ \begin{align}
\tanh^{-1}(\sin(-x)) &= -\tanh^{-1}(\sin(x))\\
\end{align}$$
また、$L$は約85なので、
$$ \begin{align}
\frac{1}{\pi}\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)&=1\\
\end{align}$$


ところで、これまで緯度の表示可能上限$L$を定数として扱ったが、実際には上の式を満たすように$L$が決められている。上の式を$L$について解くと
$$ \begin{align}
L&=\frac{180}{\pi}\sin^{-1}\left(\tanh(\pi)\right)\\
&=85.05112878
\end{align}$$
が得られる。すなわち、緯度$85.05112878$度より北極側の地図をGoogle Maps APIでは表示できない。南極側についても同様。

直感的には、緯度90度(北極点)および-90度(南極点)も表示できそうであるがそうはならない。変換式(2)に緯度90度および-90度を代入して計算してみると分かるように、それぞれ$+\infty, -\infty$(無限大)になってしまう。無限大を避けるため緯度の上下限$\pm L$が決められている。


●ピクセル座標の位置$p$から、世界測地系の経度$x$への変換式

変換式(1)の逆関数を求めればよい。

$$ \begin{align}
x(p, z) &= 180\left(\frac{p}{2^{z+7}}-1\right) \hspace{1cm}\cdots (3)
\end{align}$$

●ピクセル座標の位置$q$から、世界測地系の緯度$y$への変換式

変換式(2)の逆関数を求めればよい。

$$ \begin{align}
y(q, z) &= \frac{180}{\pi}\left(\sin^{-1}\left(\tanh\left(-\frac{\pi}{2^{z+7}}q+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right)\right)\right) \hspace{1cm}\cdots (4)
\end{align}$$
ちなみに、$\tanh(x)$は双曲線正接(ハイパボリックタンジェント)。



ここまで、世界測地系とピクセル座標間を交互に変換する式を導いてきた。しかし、ピクセル座標はGoogle Maps API内部で用いられているため利用者からは(おそらく)知ることができないため、変換式(1)~(4)をそのままでは用いることはできない。

そこで、式(1)~(4)を用いて、新たに世界測地系・画像座標間の変換式を導く。

世界測地系から画像座標への変換は、次の手順で導出できる(上図も参照)。
・世界測地系の中心である経緯度$(x_c, y_c)$およびマーカーの経緯度$(x, y)$を、それぞれピクセル座標$(p_c, q_c)$、$(p, q)$に変換する。
・ピクセル座標上で、マーカーの位置$(p, q)$を$(p_c, q_c)$分だけ平行移動すると、画像座標の変位$(X, Y)$を得ることができる。ただし、ピクセル座標と画像座標では縦軸の方向が逆であることに注意する必要がある。

画像座標から世界測地系への変換式は、上で導いた変換式の逆関数を求めれば良い。


それでは、変換式を導いていく。

●世界測地系の経度$x$から、画像座標の位置$X$への変換式

式(1)を用いる。
$$ \begin{align}
X(x_c, x, z) &= p(x, z) - p(x_c, z)\\
&= 2^{z+7}\left(\frac{x}{180}+1\right)-2^{z+7}\left(\frac{x_c}{180}+1\right)\\
&= 2^{z+7}\left(\frac{x-x_c}{180}\right) \hspace{1cm}\cdots (5)
\end{align}$$

●世界測地系の緯度$y$から、画像座標の位置$Y$への変換式

式(2)を用いる。
$$ \begin{align}
Y(y_c, y, z) &=q(y_c, z) -q(y, z) \\
&= \frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y_c\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right) \\
&-\frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}L\right)\right)\right) \\
&= \frac{2^{z+7}}{\pi}\left(-\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y_c\right)\right)+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y\right)\right)\right)\hspace{1cm}\cdots (6)
\end{align}$$


●画像座標の位置$X$から、世界測地系の経度$x$への変換式

式(5)を$x$について解けばよい。
$$ \begin{align}
x(x_c, X, z) &= \frac{180}{2^{z+7}}X+x_c \hspace{1cm}\cdots (7)
\end{align}$$

●画像座標の位置$Y$から、世界測地系の緯度$y$への変換式

式(6)を$y$について解けばよい。
$$ \begin{align}
y(y_c, Y, z) &= \frac{180}{\pi}\sin^{-1}\left(\tanh\left(\frac{\pi}{2^{z+7}}Y+\tanh^{-1}\left(\sin\left(\frac{\pi}{180}y_c\right)\right)\right)\right) \hspace{1cm}\cdots (8)\\
\end{align}$$


なお、表示対象領域の中心$(x_c, y_c)$が画像座標の原点に変換されることは、式(5),(6)の$(x,y)$に$(x_c, y_c)$を代入すればすぐわかる。
さらに、世界測地系のある点$(\tilde{x}, \tilde{y})$を世界測地系→画像座標→世界測地系と変換すれば元の点$(\tilde{x}, \tilde{y})$に戻ることも容易に示すことができる。すなわち次の式が成り立つ。
$$ \begin{align}
x(x_c, X(x_c, \tilde{x}, z), z)&=\tilde{x}\\
y(y_c, Y(y_c, \tilde{y}, z), z)&=\tilde{y}
\end{align}$$


以上で各座標系間の変換式を求めることができた。

次の記事「Google Maps の座標間変換式について(2)」では、これらの変換式が有効であることを、Google Static Maps APIを使って実際に確かめる。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

Author:hosohashi
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。