Dziękuję Gilesowi Gardamowi za jego odpowiedź, ale dotyczy tylko długości geograficznej, a nie szerokości geograficznej. Kompletne rozwiązanie powinno obliczyć poziom powiększenia wymagany dla szerokości geograficznej i poziom powiększenia wymagany dla długości geograficznej, a następnie wziąć mniejszy (dalej) z tych dwóch.
Oto funkcja, która używa zarówno szerokości, jak i długości geograficznej:
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
Parametry:
Wartość parametru „bounds” powinna wynosić a google.maps.LatLngBounds
obiektem.
Wartość parametru „mapDim” powinna być obiektem z właściwościami „height” i „width”, które reprezentują wysokość i szerokość elementu DOM wyświetlającego mapę. Możesz chcieć zmniejszyć te wartości, jeśli chcesz zapewnić dopełnienie. Oznacza to, że możesz nie chcieć, aby znaczniki mapy w granicach znajdowały się zbyt blisko krawędzi mapy.
Jeśli korzystasz z biblioteki jQuery, mapDim
wartość można uzyskać w następujący sposób:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Jeśli używasz biblioteki Prototype, wartość mapDim można uzyskać w następujący sposób:
var mapDim = $('mapElementId').getDimensions();
Wartość zwracana:
Wartość zwracana to maksymalny poziom powiększenia, który nadal będzie wyświetlał całe granice. Ta wartość będzie wynosić między0
od maksymalnego poziomu powiększenia włącznie.
Maksymalny poziom powiększenia to 21. (myślę, że było to tylko 19 dla Google Maps API v2.)
Wyjaśnienie:
Mapy Google używają odwzorowania Mercator. W rzucie Mercatora linie długości geograficznej są równomiernie rozmieszczone, ale linie szerokości geograficznej nie. Odległość między liniami szerokości geograficznej zwiększa się w miarę przechodzenia od równika do biegunów. W rzeczywistości odległość zbliża się do nieskończoności, gdy dociera do biegunów. Mapa Google Maps nie pokazuje jednak szerokości geograficznych powyżej około 85 stopni na północ ani poniżej około -85 stopni na południe. ( odniesienie ) (Obliczam faktyczną wartość odcięcia przy +/- 85,05112877980658 stopni.)
To sprawia, że obliczanie ułamków dla granic jest bardziej skomplikowane dla szerokości geograficznej niż dla długości geograficznej. Użyłem wzoru z Wikipedii, aby obliczyć ułamek szerokości geograficznej. Zakładam, że jest to zgodne z projekcją używaną przez Google Maps. W końcu strona dokumentacji Google Maps, do której odsyłam powyżej, zawiera link do tej samej strony Wikipedii.
Inne notatki:
- Poziomy powiększenia mieszczą się w zakresie od 0 do maksymalnego poziomu powiększenia. Poziom powiększenia 0 to mapa w pełni pomniejszona. Wyższe poziomy powodują dalsze powiększanie mapy. ( odniesienie )
- Na poziomie powiększenia 0 cały świat może być wyświetlany w obszarze o wielkości 256 x 256 pikseli. ( odniesienie )
- Dla każdego wyższego poziomu powiększenia liczba pikseli potrzebnych do wyświetlenia tego samego obszaru podwaja się zarówno pod względem szerokości, jak i wysokości. ( odniesienie )
- Mapy zawijają się w kierunku podłużnym, ale nie w kierunku równoleżnikowym.