2014年6月7日土曜日

Map Methods getProjection()


Projectionを取得します。
標準のマップはズーム値が0の場合は
256x256サイズの画像なので、
サンプルの地図の上をマウスでなぞると、
日付変更線の上端辺りから(0,0)で、
右方向にマウスを移動するとx座標が255まで増えると思います。
上下方向は領域外があるので今回は割愛します。

ここでズームを一回すると、
地図は縦2倍、横2倍になるので解像度は2倍の512x512になります。
さらにもう一回ズームすると解像度はその2倍なので1024x1024になります。
ズームする度に解像度は2倍、2倍、・・・と増えていきます。
5回ズームしたら2の5乗倍の解像度になります。
その辺の調整をしているのが23行目の
var pixelCoordinate = Math.pow(2, gmap.getZoom());
です。
ズーム値は最小は0なので、
pixelCoordinate の最小値は2の0乗=1になります。

また、Projectionはマップが準備中は取得に失敗する事があるので、
18行目の様に
google.maps.event.addDomListener(gmap, "projection_changed", function () {
    projection = gmap.getProjection();
});
として取得する必要があります。

24,25行目で
toFixed(0)
としているのは、
0.1ピクセルとか小数点のピクセルは無いので、
小数点は切り捨てて表示しています。

という訳で、下記サンプルです。
地図をマウスでなぞると、
その位置の緯度経度を地図画像上の位置(px)に変換します。
最大ズーム時の地図画像の大きさは約5億3千万(px)x約5億3千万(px)
というとても大きな画像のようです。

<!DOCTYPE html> 
<html lang="ja"> 
<head> 
    <meta charset="utf-8" /> 
    <title> google maps api v3</title> 
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> </script> 
    <script type="text/javascript"> 
        google.maps.event.addDomListener(window, "load", function () {
            var map = document.getElementById("map_canvas");
            var latlng = new google.maps.LatLng(35.635571, 139.766036);
            var mapOptions = {
                zoom: 0,
                center: latlng
            };
            var gmap = new google.maps.Map(map, mapOptions);

            var projection = null;
            google.maps.event.addDomListener(gmap, "projection_changed", function () {
                projection = gmap.getProjection();
            });
            google.maps.event.addDomListener(gmap, "mousemove", function (e) {
                var mousemovePosition = projection.fromLatLngToPoint(e.latLng);
                var pixelCoordinate = Math.pow(2, gmap.getZoom());
                var x = (mousemovePosition.x * pixelCoordinate).toFixed(0) + "px";
                var y = (mousemovePosition.y * pixelCoordinate).toFixed(0) + "px";
                var note = document.getElementById("note");
                note.innerHTML = "x = " + x + "<br /> y = " + y;
            });
        });
    </script> 
</head> 
<body> 
    <div id="map_canvas" style="width: 400px; height: 400px"> </div> 
    <p id="note" style="padding: 10px; background-color:#f50; color: #fff;"> 
        x = 0px<br /> 
        y = 0px
    </p> 
</body> 
</html> 

x = 0px

y = 0px


このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿