Merci à Giles Gardam pour sa réponse, mais elle ne concerne que la longitude et non la latitude. Une solution complète devrait calculer le niveau de zoom nécessaire pour la latitude et le niveau de zoom nécessaire pour la longitude, puis prendre le plus petit (le plus éloigné) 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);
}
Demo on jsfiddle
Paramètres:
La valeur du paramètre «limites» doit être un google.maps.LatLngBounds
objet.
La valeur du paramètre "mapDim" doit être un objet avec des propriétés "height" et "width" qui représentent la hauteur et la largeur de l'élément DOM qui affiche la carte. Vous souhaiterez peut-être diminuer ces valeurs si vous souhaitez garantir un remplissage. Autrement dit, vous ne voudrez peut-être pas que les marqueurs de carte dans les limites soient trop proches du bord de la carte.
Si vous utilisez la bibliothèque jQuery, la mapDim
valeur peut être obtenue comme suit:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Si vous utilisez la bibliothèque Prototype, la valeur mapDim peut être obtenue comme suit:
var mapDim = $('mapElementId').getDimensions();
Valeur de retour:
La valeur de retour est le niveau de zoom maximum qui affichera toujours toutes les limites. Cette valeur sera comprise entre 0
et le niveau de zoom maximum, inclus.
Le niveau de zoom maximal est de 21. (je crois qu'il n'était que de 19 pour l'API Google Maps v2.)
Explication:
Google Maps utilise une projection Mercator. Dans une projection Mercator, les lignes de longitude sont également espacées, mais les lignes de latitude ne le sont pas. La distance entre les lignes de latitude augmente au fur et à mesure qu'elles vont de l'équateur aux pôles. En fait, la distance tend vers l'infini lorsqu'elle atteint les pôles. Une carte Google Maps, cependant, n'indique pas les latitudes au-dessus d'environ 85 degrés nord ou en dessous d'environ -85 degrés sud. ( référence ) (Je calcule le seuil réel à +/- 85,05112877980658 degrés.)
Cela rend le calcul des fractions pour les limites plus compliqué pour la latitude que pour la longitude. J'ai utilisé une formule de Wikipedia pour calculer la fraction de latitude. Je suppose que cela correspond à la projection utilisée par Google Maps. Après tout, la page de documentation Google Maps vers laquelle je renvoie ci-dessus contient un lien vers la même page Wikipédia.
Autres notes:
- Les niveaux de zoom vont de 0 au niveau de zoom maximum. Le niveau de zoom 0 est la carte entièrement agrandie. Des niveaux plus élevés agrandissent davantage la carte. ( référence )
- Au niveau de zoom 0, le monde entier peut être affiché dans une zone de 256 x 256 pixels. ( référence )
- Pour chaque niveau de zoom supérieur, le nombre de pixels nécessaires pour afficher la même zone double à la fois en largeur et en hauteur. ( référence )
- Les cartes s'enroulent dans le sens longitudinal, mais pas dans le sens latitudinal.