1.各ズームサイズにおける縮尺(というか経度緯度とドットとの関係)の計算の仕方
全国ロケ地図(http://saya.s145.xrea.com/x/lmap.html)を作っているときに、全てのマーカーを表示したいとか、マーカーを重ならないように引き出し線等で表示したい(印刷用)という要望がありました。
前者は、全マーカの中心に移動しズームアウトしていき、表示範囲を取得(getBoundsLatLng)して全て入ったところでやめるというかなり無理矢理なやり方をしています。
後者も表示範囲(getSpanLatLng)から経度緯度とドットの関係を計算して、うまく配置するしかないのでしょうか?
2.InfoWindowのサイズについて
InfoWindowの中のhtmlをdiv等のサイズ指定で表示するとサイズが指定できますが、
・横幅をある程度以上小さくできない
(http://saya.s145.xrea.com/x/weather.html)
・Safari(Mac)だとスクロールバーを動かせない
(http://saya.s145.xrea.com/x/tab.html)
に対する対策はないでしょうか?
3.マーカーの表示順の変更や表示・非表示をできないのか?
今のところ、下に置きたいマーカーから描画したり、表示・非表示の切り替えをclearOverlayして書き直したりしてますが、もっと簡単にできたりしないでしょうか?
うちのスクリプト KsGMap
でも、同機能を搭載しました。
最初はmasaさんの方法と同じ方法で取得したのですが、かなり速度が遅くなるので、独自に計算しています。
http://www.movies.ne.jp/theatermap/release_script.html
の スクリプト本体 から KsGMapPoint_moveCenterAndZoom関数
を参考にして下さい。
具体的には、現在のマップから一つ広域のマップは、現在のマップ縦横の2倍の大きさという性質から計算できます。
(log
とか計算方法を忘れて、実装にかなり手間取ってしまいました)
> 後者も表示範囲(getSpanLatLng)から経度緯度とドットの関係を計算して、うまく配置するしかないのでしょうか?
ちょっとイメージが分からないのですが、マーカーを線にしてはだめなのでしょうか?
>横幅をある程度以上小さくできない
APIが描写する影の関係ではないでしょうか?
小さいのは独自な情報ウィンドウを作ったほうがいいかも知れません。
> ちょっとイメージが分からないのですが、マーカーを線にしてはだ めなのでしょうか
マーカーがIDになっていて、別ウィンドウの一覧と対応しているようなイメージです。
(http://saya.s145.xrea.com/x/lmap.html)
印刷して持ち運ぶためとのことです。モバイルでもGoogle
Mapsが動けば必要ないのですが。
あとは表示内容にあわせてがんばってズラすしか無いと思います。
御意。
飽くまでうちのサイトに書いたのは、日本近辺でのざっくりとした値で書いてます。
どこの緯度で計測したかも忘れました。
また、求めたのは距離(m)とピクセルの関係で、左下のスケールの表示値とスケールメモリ間のピクセルをPaintShopで確認して計算したものです。
正確な経緯度とピクセルの対照は仕様としてGoogleから出てこないと知る事は無理ですが、
数ピクセル程度の誤差は許容するなら上のやり方のようなやり方で出せますよ。
まず、地図画像が特徴的なところを選んで、中心点の経緯度を求めます。
そこから、APIで正確に経緯度で何秒かずらして、また地図画像を得ます。
前者と後者の画像を、PaintShopなんかで拡大して、何ピクセルずれたかを目で読み取ります。
これを、ずらす量などを増減して、また他の点でも試してみて、経緯度ズレ量とピクセルズレ量のサンプルをまあ4~50例くらいは集めます。
集まったら、それを元に経度・緯度とピクセル差/秒差との関係をプロットして、近似曲線を引いてやればOK。
近似してやる曲線は、図法がメルカトルなので、経度方向は線形(というか一定)だろうし緯度方向もなんか理論で求まるはず。
3年~1年ほど前、携帯版地図サイトを運営していた時は、PC向け地図サイトの地図をパクッて表示させていたんですが、上の方法で経緯度差とピクセルの関係を計算して、現在表示中の地図から何ピクセル移動、とかを制御してました。
でも、ズラした場所が他と重ならないかチェックが必要ですね。
平面地図は必ず歪んでいる事を忘れたらいけないのか...地図からのアプローチはいろいろあって難しいですな。
直接は無理ですが、算出することは可能です。こんな感じ。
var bounds = map.getBoundsLatLng();
var degreesParPixel_lng = ( ( bounds.maxX - bounds.minX ) /
document.getElementById( "map" ).offsetWidth
); //1ピクセル辺りの経度
緯度も同じようにやればOKです。
(GBoundsでなくてGSizeのwidthでも前半の値をとることが出来ますが、なんかこれ仕様と違うような気がするので、GBounds使っています)
ところで、旅行誌などの地図は、情報が集まり過ぎている部分は、別ページにしていますよね。
あえて、情報密集区は詳細でしか表示しないというのも一つの手かも知れません。
その手の計算はすべてmaps.jsに書いてありました、読むのが相当大変でしたけれども。
あとは日本をはずれた場合の測地系の違いも考慮しないといけません。
例えばzoom=13以上で表示した場合は同一画面上での差が相当出てきてしまうので、その場合は測地系の違いを計算するJavaScriptを用意しないといけないかもしれません。
> ここギコねねさん
微妙にメルカトルでない模様。そこが厄介です。