Gracias a Giles Gardam por su respuesta, pero solo aborda la longitud y no la latitud. Una solución completa debe calcular el nivel de zoom necesario para la latitud y el nivel de zoom necesario para la longitud, y luego tomar el más pequeño (más alejado) de los dos.
Aquí hay una función que usa tanto latitud como longitud:
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
Parámetros:
El valor del parámetro "límites" debe ser un google.maps.LatLngBounds
objeto.
El valor del parámetro "mapDim" debe ser un objeto con propiedades de "altura" y "ancho" que representen la altura y el ancho del elemento DOM que muestra el mapa. Es posible que desee disminuir estos valores si desea garantizar el relleno. Es decir, es posible que no desee que los marcadores de mapa dentro de los límites estén demasiado cerca del borde del mapa.
Si está utilizando la biblioteca jQuery, el mapDim
valor se puede obtener de la siguiente manera:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Si está utilizando la biblioteca Prototype, el valor de mapDim se puede obtener de la siguiente manera:
var mapDim = $('mapElementId').getDimensions();
Valor de retorno:
El valor de retorno es el nivel de zoom máximo que aún mostrará los límites completos. Este valor estará entre 0
y el nivel máximo de zoom, inclusive.
El nivel máximo de zoom es 21. (Creo que fue solo 19 para la API de Google Maps v2).
Explicación:
Google Maps utiliza una proyección de Mercator. En una proyección de Mercator, las líneas de longitud están igualmente espaciadas, pero las líneas de latitud no. La distancia entre las líneas de latitud aumenta a medida que van desde el ecuador hasta los polos. De hecho, la distancia tiende hacia el infinito cuando llega a los polos. Sin embargo, un mapa de Google Maps no muestra latitudes superiores a aproximadamente 85 grados norte o inferiores a aproximadamente -85 grados sur. ( referencia ) (Calculo el límite real a +/- 85.05112877980658 grados).
Esto hace que el cálculo de las fracciones para los límites sea más complicado para la latitud que para la longitud. Usé una fórmula de Wikipedia para calcular la fracción de latitud. Supongo que esto coincide con la proyección utilizada por Google Maps. Después de todo, la página de documentación de Google Maps que enlazo arriba contiene un enlace a la misma página de Wikipedia.
Otras notas:
- Los niveles de zoom van desde 0 hasta el nivel máximo de zoom. El nivel de zoom 0 es el mapa totalmente alejado. Los niveles más altos amplían el mapa aún más. ( referencia )
- En el nivel de zoom 0, el mundo entero se puede mostrar en un área de 256 x 256 píxeles. ( referencia )
- Para cada nivel de zoom más alto, el número de píxeles necesarios para mostrar la misma área se duplica tanto en ancho como en alto. ( referencia )
- Los mapas se envuelven en la dirección longitudinal, pero no en la dirección latitudinal.