Grazie a Giles Gardam per la sua risposta, ma si rivolge solo alla longitudine e non alla latitudine. Una soluzione completa dovrebbe calcolare il livello di zoom necessario per la latitudine e il livello di zoom necessario per la longitudine, quindi prendere il più piccolo (più lontano) dei due.
Ecco una funzione che utilizza sia la latitudine che la longitudine:
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
parametri:
Il valore del parametro "limiti" dovrebbe essere un google.maps.LatLngBounds
oggetto.
Il valore del parametro "mapDim" dovrebbe essere un oggetto con proprietà "height" e "width" che rappresentano l'altezza e la larghezza dell'elemento DOM che visualizza la mappa. È possibile che si desideri ridurre questi valori se si desidera garantire il riempimento. Cioè, potresti non voler che gli indicatori di mappa all'interno dei limiti siano troppo vicini al bordo della mappa.
Se si utilizza la libreria jQuery, il mapDim
valore può essere ottenuto come segue:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Se si utilizza la libreria Prototype, il valore mapDim può essere ottenuto come segue:
var mapDim = $('mapElementId').getDimensions();
Valore di ritorno:
Il valore di ritorno è il livello massimo di zoom che mostrerà comunque tutti i limiti. Questo valore sarà compreso tra 0
e il livello massimo di zoom, incluso.
Il livello massimo di zoom è 21. (credo che fosse solo 19 per l'API di Google Maps v2.)
Spiegazione:
Google Maps utilizza una proiezione Mercator. In una proiezione di Mercatore le linee di longitudine sono equidistanti, ma non le linee di latitudine. La distanza tra le linee di latitudine aumenta man mano che si passa dall'equatore ai poli. In effetti la distanza tende all'infinito quando raggiunge i poli. Una mappa di Google Maps, tuttavia, non mostra latitudini superiori a circa 85 gradi a nord o inferiori a circa -85 gradi a sud. ( riferimento ) (calcolo il taglio effettivo a +/- 85,05112877980658 gradi.)
Questo rende il calcolo delle frazioni per i limiti più complicato per la latitudine che per la longitudine. Ho usato una formula di Wikipedia per calcolare la frazione di latitudine. Suppongo che corrisponda alla proiezione utilizzata da Google Maps. Dopotutto, la pagina della documentazione di Google Maps che collego sopra contiene un collegamento alla stessa pagina di Wikipedia.
Altre note:
- I livelli di zoom vanno da 0 al livello massimo di zoom. Il livello di zoom 0 è la mappa completamente ridotta. Livelli più alti ingrandiscono ulteriormente la mappa. ( riferimento )
- A livello di zoom 0 l'intero mondo può essere visualizzato in un'area di 256 x 256 pixel. ( riferimento )
- Per ogni livello di zoom più elevato il numero di pixel necessari per visualizzare la stessa area raddoppia sia in larghezza che in altezza. ( riferimento )
- Le mappe si avvolgono nella direzione longitudinale, ma non nella direzione latitudinale.