Giles Gardamの回答に感謝しますが、緯度ではなく経度のみを扱います。完全なソリューションでは、緯度に必要なズームレベルと経度に必要なズームレベルを計算し、2つのうち小さい方(さらに外側)を取得する必要があります。
緯度と経度の両方を使用する関数は次のとおりです。
function getBoundsZoomLevel(bounds, mapDim) {
var WORLD_DIM = { height: 256, width: 256 };
var ZOOM_MAX = 21;
function latRad(lat) {
var sin = Math.sin(lat * Math.PI / 180);
var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
function zoom(mapPx, worldPx, fraction) {
return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
}
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;
var lngDiff = ne.lng() - sw.lng();
var lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);
var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);
return Math.min(latZoom, lngZoom, ZOOM_MAX);
}
Demo on jsfiddle
パラメーター:
「境界」パラメータ値はgoogle.maps.LatLngBounds
オブジェクトである必要があります。
「mapDim」パラメータ値は、マップを表示するDOM要素の高さと幅を表す「height」と「width」プロパティを持つオブジェクトである必要があります。パディングを確実にしたい場合は、これらの値を減らすことができます。つまり、境界内のマップマーカーをマップの端に近づけすぎないようにする必要があります。
jQueryライブラリを使用している場合、mapDim
値は次のように取得できます。
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
プロトタイプライブラリを使用している場合、mapDim値は次のように取得できます。
var mapDim = $('mapElementId').getDimensions();
戻り値:
戻り値は、境界全体を表示する最大ズームレベルです。この値は0
、とを含む最大ズームレベルの間になります。
最大ズームレベルは21です(Google Maps API v2では19でした。)
説明:
Googleマップはメルカトル図法を使用しています。メルカトル図法では、経度の線は等間隔ですが、緯度の線は等間隔ではありません。緯度の線の間の距離は、赤道から極に向かって増加します。実際、距離が極に達すると、無限に向かう傾向があります。ただし、Googleマップの地図には、北緯約85度以上または南緯約-85度以下の緯度は表示されません。(参考)(+/- 85.05112877980658度で実際のカットオフを計算します。)
これにより、境界の分数の計算は、経度よりも緯度の方が複雑になります。ウィキペディアの公式を使用して、緯度の割合を計算しました。これは、Googleマップで使用される投影法に一致すると想定しています。結局のところ、上記にリンクしたGoogleマップのドキュメントページには、同じWikipediaページへのリンクが含まれています。
その他の注意事項:
- ズームレベルの範囲は0から最大ズームレベルです。ズームレベル0は、マップが完全にズームアウトされた状態です。レベルを高くすると、マップがさらに拡大されます。(参考)
- ズームレベル0では、全世界を256 x 256ピクセルの領域に表示できます。(参考)
- より高いズームレベルごとに、同じ領域を表示するために必要なピクセル数は、幅と高さの両方で2倍になります。(参考)
- マップは縦方向にラップしますが、横方向にはラップしません。