GoogleMapsの図法

2,078 views
Skip to first unread message

石川

unread,
Feb 25, 2009, 12:19:18 PM2/25/09
to Google-Maps-API-Japan
大発見をした気になって、興奮して書き込んでいます。

GoogleMapsの図法はメルカトル図法ではないですよね?ミラー図法ですよね?

StaticMapsAPIを駆使して携帯から自在に操作できる地図を目指して開発をしています。
地図上にピクセル単位で描画をするために、緯度経度とピクセルの相関関係を調べていました。
そうしたところ、どうやっても計算が合いませんでした。
メルカトル図法を調べて、tanとatanを組み合わせて、どうやっても想定する結果と違う結果が出てしまいました。
そこで、思い切って「GoogleMapsはメルカトル図法ではないのでは???」と疑って、ためしにミラー図法として算出したら・・
これが、ぴったり!!

http://imakoko.didit.jp/imakoko_html/memo/projection.php

ググると「GoogleMapsはメルカトル図法です」と断定しているページが多く、これは誰もが気づいていない発見では???
本国アメリカでは周知の事実かも知れませんが(英語がわからないので英語ページは検索していない)、日本では誤解されているのでは?と思いました。

MLメンバーの中でひょっとしてご存じの方いらっしゃるでしょうか?
「そんなの知ってるよ・・・」とおっしゃるかも知れませんが、、、ログとして残したく投稿しました。

失礼しましたm(_ _)m


・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
いまココ!GPS☆マップ
http://imakoko.didit.jp
石川 将行
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

Masashi.K

unread,
Feb 25, 2009, 7:23:08 PM2/25/09
to Google-Maps-API-Japan
へー、そうなんですか。
私はプログラミングから使い始めたクチなので、いまいちその辺りは詳しくないのですが、
Google Maps APIのリファレンスには「メルカトル図法のための・・・」って日本語で書いてありますよ。

■GMercatorProjection
http://code.google.com/intl/ja/apis/maps/documentation/reference.html#GMercatorProjection

hiroaki

unread,
Feb 26, 2009, 1:17:47 PM2/26/09
to Google-Maps-API-Japan
こんばんは。

GMercatorProjection クラスがあるくらいだから、デフォルトはメルカトル図法でないな、って逆説的に思ってました。ただ、私の扱う
範囲では投影法はあまり考えて作っていなかったです。デフォルトで行こうという意向です ね。

ところで、(このスレッドをお借りして、便乗質問で恐縮ですが)
緯度経度からピクセル座標への変換は、 GMap2.fromLatLngToContainerPixel(GLatLng) または
GMap2.fromLatLngToDivPixel(GLatLng) で行いますが、どのような場面で、これらは使いわけるものなのでしょうか。
また、これらも投影法が考慮された結果を返すのでしょうか? 折をみて調べてみたいと思ってましたが、なにか参考になるところがありましたら、おしえて
くださると助かります。

Masashi.K

unread,
Feb 26, 2009, 7:19:02 PM2/26/09
to Google-Maps-API-Japan
>hiroakiさん

>GMercatorProjection クラスがあるくらいだから、デフォルトはメルカトル図法でないな、って逆説的に思ってました。ただ、私の扱う
>範囲では投影法はあまり考えて作っていなかったです。デフォルトで行こうという意向です ね。
私もそんな感じですね~。
といいつつ、まさに今GProjectionを使ったライブラリ作りに挑戦しているところですよ。
(大丈夫かいな・・笑)

>GMap2.fromLatLngToContainerPixel(GLatLng) と GMap2.fromLatLngToDivPixel
(GLatLng)  の違い
私も便乗して、ここの話は聞いてみたいですね。
2・3日その辺りの関数を触ってみているのですが、その両者の違いがイマイチ・・・。

ということで、私も教えていただけると幸いです。

Masashi.K

unread,
Feb 27, 2009, 11:27:35 AM2/27/09
to Google-Maps-API-Japan
ちゃんと調べてみました。
技術評論社の「Goolge Maps APIv2」の本によると、

------------------------------
■GMap2.fromDivPixelToLatLng(pixel)
ピクセル座標で指定したdivコンテナ内の位置を緯度経度に変換する

地図を含むdivコンテナ(divタグで囲まれた範囲)の中で、ピクセル座標で
指定されている位置から地理的な経度と緯度を計算します。自作の
オーバーレイを作成して、対話的に地図を操作するような場合に利用します。

------------------------------
■GMap2.fromContainerPixelToLatLng(pixel)
ピクセル座標で指定したHTMLコンテナ内の位置を緯度経度に変換する

地図を含むHTMLコンテナの中で、ピクセル座標で指定されている位置から
地理的な緯度と経度を計算します。自作のコントロールを使って、対話的に
地図を操作するような場合に利用します。

------------------------------

だそうです。

まとめると、
fromDivPixelToLatLng
 ↓
GMap2 を作成するときに指定したdivコンテナを基準にして計算

fromContainerPixelToLatLng
 ↓
実際に地図を表示している<img>を格納しているHTMLコンテナ
(→Firebug等で確認できますよ)を基準にして計算

ということのようです。

石川

unread,
Feb 28, 2009, 1:31:30 AM2/28/09
to Google-Maps-API-Japan
しかし、JS版のAPIは充実していますがStaticMapsAPIでfromDivPixelToLatLngのようなことは出来ないのでしょう
か・・・
それができれば今回のように図法のことで悩んだりせずに済むのですが。
しかも、ミラー図法に近けれど、断定できないのは、

http://imakoko.didit.jp/imakoko_html/memo/projection.php

のデモ見ていただいたとおり、「微妙に」ずれています。
うーん、自分でSuperStaticsMapsAPIを作ろうと思ったのですが、いろいろと壁にぶつかります。

あ、ひょっとして私が知らないだけでStaticMapsAPIでピクセルと緯度経度の相関関係を導く方法があるのでしょうか?
それがあるなら全て解決しちゃいます。

・・・ここでまた基本的なこと伺っちゃいますが、JS版のAPIのさまざまな関数の中で、値を送って返してくるだけのような関数は
ひょっとしたらサーバアプリで取得したりすることは実現可能なのでしょうか?
・・・ありそうですよね・・そんな方法。

もしあるのであれば、今までの苦労が吹き飛びます。
ご存じの方いらっしゃいますでしょうか?

ちなみにやろうとしてることは、

・StaticMapでオリジナルデザインのマーカーを好きなところ(もちろん緯度経度指定で)に配置したい
・マーカーの重なり順も思いのまま!
・文字情報を地図上に加えることも、やる気になれば情報ウィンドウもStaticMapに出せる!(やらないけど。)
・StaticMapの表示マーカー数100の制限、GETの字数1900の制限、なども関係なくなる!
http://iuc.didit.jp/blog/lab/2008/11/apigooglestaticmapsapi.html
・これらをPHP、ImageMagickで実現したい。

などなどです。

どうぞ、ご教授お願いいたします。

石川

Masashi.K

unread,
Feb 28, 2009, 5:43:15 AM2/28/09
to Google-Maps-API-Japan
>石川さん

>しかし、JS版のAPIは充実していますがStaticMapsAPIでfromDivPixelToLatLngのようなことは出来ないのでしょう
>か・・・
ないですね。基本的には画像出力だけのようです。

考え方を変えて、JavaScript版でピクセル位置を計算しておいて、LatLngに変換して、サイズ指定でStatic Maps APIに描画
させるというのはどうですか?

もしくは、基本となりうる地図画像だけをStaticMapsに取得しておいて、サーバー側でImageMagic等でマーカーの画像を合成するな
ど・・・・。

その方が目的の達成には早いと思いますけど・・・。
(StaticMapsAPIで取得した画像に情報を付け加えて出力することがライセンスに反するかどうか、というのが気になりますが・・・)

石川

unread,
Feb 28, 2009, 6:09:40 AM2/28/09
to Google-Maps-API-Japan
石川です。

> 考え方を変えて、JavaScript版でピクセル位置を計算しておいて、LatLngに変換して、サイズ指定でStatic Maps APIに描画
> させるというのはどうですか?

そ、そんなことができるんですか!?
クライアントは携帯端末ですので、私も前々から「サーバサイドでブラウザ動かさせて?JSかましてPHP経由して出力できたらどんなに楽だろう・・・」
と思っていましたが、
たぶんそんなことは実現できそうで私はそのやり方を発見できないまま今日にいたります。
是非教えていただければこの上なく幸せです!


> もしくは、基本となりうる地図画像だけをStaticMapsに取得しておいて、サーバー側でImageMagic等でマーカーの画像を合成するな
> ど・・・・。

これは、すでにやっております。。違反しないようにライセンス表記箇所はもちろん残して。おります。
この方法でやるにしても、オリジナルマーカーを好きな場所に配置するには、
ピクセルと緯度経度のコンバータを自前で作るかどうかしないといけないのです。。。

前者の方法が分かれば実現するのですが・・

hiroaki

unread,
Feb 28, 2009, 9:58:35 AM2/28/09
to Google-Maps-API-Japan
こんばんは。

Masashi.K さん、ヒントをありがとございます。

GMap2 のコンストラクタに渡す DIV の縦横サイズ=地図の縦横サイズですから、fromDivPixelToLatLng() は直感的な解
釈、用法ということですかね(直感的というのは私的なものですけども)。

一方 fromContainerPixelToLatLng() のほうは... 。地図の DIV をはみ出したところにも世界が存在するとなるの
でしょうか。そういえば以前、このことについて調べているときに、両者を比べていたときの地図は window に対して 100% のサイズの
DIV に地図を描いていたので、違いが出なかったのかもしれないです... 。


石川さん>

私は static map も携帯電話のほうも触れていないので、ほかのことにはコメントできないのですが次の点について:

> StaticMapの表示マーカー数100の制限、GETの字数1900の制限、なども関係なくなる!

この GET は HTTP の GET ですか? でしたら、制限があるものと考えておいた方がいいと思います、字数はたしか HTTP サーバの実
装によります(尤も、ご自身の管理下のサーバでしたら、いいのかもしれません)。

石川

unread,
Mar 4, 2009, 8:06:05 PM3/4/09
to Google-Maps-API-Japan
hiroakiさん

> この GET は HTTP の GET ですか? でしたら、制限があるものと考えておいた方がいいと思います、字数はたしか HTTP サーバの実
> 装によります(尤も、ご自身の管理下のサーバでしたら、いいのかもしれません)。

そうです、HTTPのGETです。
今考えているのは、たとえば

 HTTP POSTで受付 → 自作API窓口(PHP) → 地図だけをGoogleStaticMapsAPIで取得 → マーカーの描画等は自
作PHPで → 地図とマーカーをImageMagickで合成、出力

とすることで、制限なくマーカーを描画したりしたい、というものなのです。
こんなことで苦労している間にStaticMapsも次のバージョンが出たりしそうですが。。。


kino

unread,
Mar 5, 2009, 5:39:47 PM3/5/09
to Google-Maps-API-Japan
話を蒸し返すようで申し訳ないのですが、「Google Mapsはメルカトル図法」だと思います。

リンク先の数式を拝見しましたが、式変形を間違えている様に思います。
石川さんのページでは
Miller : moved_lat_top = 1.25*atan(tan(lat_deg*0.8) + move_lat) ・・・
(1)
Mercator: moved_lat_top = atan(tan(lat_deg) - move_lat) ・・・(2)

となっていますが、正しくは
Mercator: moved_lat_top = 2*atan( exp(move_lat) * tan(PI/4 + lat_deg/
2) )- PI/2 ・・・(3)
ではないでしょうか? (角度はすべてラジアンとした)

move_lat = 0.2 程度(縮尺3)では (1), (3)の誤差は最大で0.005程度になり、
縦横で2.5%の長さの違いが生じることになります。
石川さんのページで試してみると、赤道付近と高緯度ではこの程度の誤差があります。
これが「多少ずれる」と仰っていることの原因でしょう。

メルカトル図法の計算を(3)に変更すると、緯度によるズレが「全く無い」描画になるはずです。
ご参考まで。

ロケージング大塚(gmail)

unread,
Mar 7, 2009, 7:32:39 AM3/7/09
to Google-Maps-API-Japan
大塚です。
よろしくお願いします。

Projection Google Mapsでググってみましたが、Googleの中の人の発言がありました。

http://groups.google.com/group/Google-Maps-API/msg/8222b18e7921f6e6

> We use the Mercator projection for our maps. Wolfram MathWorld has a good
> page on the projection (and a bunch of other map projections):

なので、メルカトルで間違いないと思います。

#メルカトルであることを前提にしたPerlモジュールCPANに挙げてるので、メルカトルで
#なければ涙目でした...

石川

unread,
Mar 9, 2009, 1:41:18 AM3/9/09
to Google-Maps-API-Japan
>kinoさま

おお、ほ、ほんとですか・・だとしたらとんだ勘違いでした!失礼しました。。
まだ試していませんが、また試してご報告させていただきます。
もし「ズレが全く無い描画」になるのだとしたら、これまで悩んでいた問題が解決し、前に進めます!
ありがとうございますm(_ _)m

>大塚さま

なるほど、私は英語を読めず、たどり着けないで今した。・・ありがとうございます!


石川

Masashi.K

unread,
Mar 16, 2009, 1:58:09 AM3/16/09
to Google-Maps-API-Japan
>石川さん

「Google Static Maps APIで取得した画像に合成をして良いのか?」という点が
気になっていたので、Google さんに質問してみました。

その結果、【NG】だそうです。

ということで、SuperStaticsMapsAPI はそれ以外の方法を試みてください。

ご参考まで。
Reply all
Reply to author
Forward
0 new messages