Vielen Dank an Giles Gardam für seine Antwort, die jedoch nur den Längen- und nicht den Breitengrad anspricht. Eine vollständige Lösung sollte die für den Breitengrad erforderliche Zoomstufe und die für den Längengrad erforderliche Zoomstufe berechnen und dann die kleinere (weiter außen liegende) der beiden herausnehmen.
Hier ist eine Funktion, die sowohl Breiten- als auch Längengrade verwendet:
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
Parameter:
Der Parameterwert "Grenzen" sollte ein google.maps.LatLngBounds
Objekt sein.
Der Parameterwert "mapDim" sollte ein Objekt mit den Eigenschaften "height" und "width" sein, die die Höhe und Breite des DOM-Elements darstellen, das die Karte anzeigt. Sie können diese Werte verringern, wenn Sie das Auffüllen sicherstellen möchten. Das heißt, Sie möchten möglicherweise nicht, dass Kartenmarkierungen innerhalb der Grenzen zu nahe am Rand der Karte liegen.
Wenn Sie die jQuery-Bibliothek verwenden, kann der mapDim
Wert wie folgt abgerufen werden:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Wenn Sie die Prototype-Bibliothek verwenden, kann der mapDim-Wert wie folgt abgerufen werden:
var mapDim = $('mapElementId').getDimensions();
Rückgabewert:
Der Rückgabewert ist die maximale Zoomstufe, bei der weiterhin die gesamten Grenzen angezeigt werden. Dieser Wert liegt zwischen 0
und einschließlich der maximalen Zoomstufe.
Die maximale Zoomstufe beträgt 21. (Ich glaube, es waren nur 19 für Google Maps API v2.)
Erläuterung:
Google Maps verwendet eine Mercator-Projektion. In einer Mercator-Projektion sind die Längengrade gleich beabstandet, die Breitengrade jedoch nicht. Der Abstand zwischen den Breitengraden nimmt zu, wenn sie vom Äquator zu den Polen verlaufen. Tatsächlich tendiert die Entfernung gegen unendlich, wenn sie die Pole erreicht. Eine Google Maps-Karte zeigt jedoch keine Breiten über ungefähr 85 Grad Nord oder unter ungefähr -85 Grad Süd. ( Referenz ) (Ich berechne den tatsächlichen Grenzwert bei +/- 85.05112877980658 Grad.)
Dies macht die Berechnung der Brüche für die Grenzen für den Breitengrad komplizierter als für den Längengrad. Ich habe eine Formel aus Wikipedia verwendet , um den Breitengradanteil zu berechnen. Ich gehe davon aus, dass dies mit der von Google Maps verwendeten Projektion übereinstimmt. Schließlich enthält die oben verlinkte Google Maps-Dokumentationsseite einen Link zu derselben Wikipedia-Seite.
Weitere Hinweise:
- Die Zoomstufen reichen von 0 bis zur maximalen Zoomstufe. Zoomstufe 0 ist die Karte, die vollständig herausgezoomt ist. Höhere Ebenen vergrößern die Karte weiter. ( Referenz )
- Bei Zoomstufe 0 kann die gesamte Welt in einem Bereich von 256 x 256 Pixel angezeigt werden. ( Referenz )
- Für jede höhere Zoomstufe verdoppelt sich die Anzahl der Pixel, die zur Anzeige des gleichen Bereichs benötigt werden, sowohl in der Breite als auch in der Höhe. ( Referenz )
- Karten werden in Längsrichtung, jedoch nicht in Breitenrichtung gewickelt.