Grâce à Giles Gardam pour sa réponse, mais il ne traite que de la longitude et de ne pas la latitude. Une solution complète doit calculer le niveau de zoom nécessaires pour la latitude et le niveau de zoom est nécessaire pour la longitude, puis prendre la plus petite (en plus) des deux.
Voici une fonction qui utilise à la fois la latitude et la longitude:
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);
}
Démo sur jsfiddle
Paramètres:
Les "limites" valeur du paramètre doit être un google.maps.LatLngBounds
objet.
Le "mapDim" valeur du paramètre doit être un objet avec "hauteur" et "largeur" des propriétés qui représentent la hauteur et la largeur de l'élément du DOM qui affiche la carte. Vous pouvez diminuer ces valeurs si vous souhaitez vous assurer de rembourrage. C'est, peut ne pas vouloir marqueurs de carte dans la limite d'être trop près du bord de la carte.
Si vous êtes à l'aide de la librairie jQuery, l' mapDim
de la valeur peut être obtenue comme suit:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Si vous êtes à l'aide de la librairie Prototype, le mapDim valeur peut être obtenue comme suit:
var mapDim = $('mapElementId').getDimensions();
Valeur De Retour:
La valeur de retour est la valeur maximale du niveau de zoom qui continue d'afficher l'ensemble des limites. Cette valeur doit être comprise entre 0
et le maximum de niveau de zoom, inclusivement.
Le niveau de zoom maximum est de 21 ans. (Je crois que c'était seulement 19 pour Google Maps API v2.)
Explication:
Google Maps utilise une projection de Mercator. Dans une projection de Mercator les lignes de longitude sont équidistants, mais les lignes de latitude sont pas. La distance entre les lignes de latitude augmenter comme ils vont de l'équateur vers les pôles. En fait, la distance tend vers l'infini, il atteint des pôles. Une carte Google Maps, cependant, ne montrent pas des latitudes supérieures à environ 85 degrés Nord ou en dessous d'environ -85 degrés au Sud. (référence) (I calculer la réelle coupure à +/-85.05112877980658 degrés).
Cela rend le calcul des fractions pour les limites plus compliqué pour la latitude de longitude. J'ai utilisé une formule à partir de Wikipedia pour calculer la latitude de la fraction. Je suis en supposant que cela correspond à la projection utilisée par Google Maps. Après tout, Google Maps page de documentation je lien ci-dessus contient un lien vers la même page de Wikipédia.
Autres Remarques:
- Niveaux de Zoom de la gamme de 0 au maximum le niveau de zoom. Le niveau de Zoom 0 est la carte entièrement zoom arrière. La hausse des niveaux de zoom de la carte. (référence)
- Au niveau de zoom 0, le monde entier peut être affiché dans un endroit qui est de 256 x 256 pixels. (référence)
- Pour chaque hausse du niveau de zoom le nombre de pixels nécessaires à l'affichage de la même zone double en largeur et en hauteur. (référence)
- Cartes enveloppez-la dans le sens longitudinal, mais pas dans la direction de largeur.