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 件のコメント:
コメントを投稿