I am trying to figure out a way of determining the zoom level of a Map before I call map.fitBounds(), and I cannot seem to find a way.
In the API v2 there was a method GMap.getBoundsZoomLevel(bounds:GLatLngBounds)
, but I can't find an equivalent in the API v3 documentation.
Is there a non-Google algorythm for determining what a zoom level will be beforehand?
A zoom level or scale is a number that defines how large or small the contents of a map appear in a map view . Scale is a ratio between measurements on a map view and measurements in the real-world.
Users can zoom the map by clicking the zoom controls. They can also zoom and pan by using two-finger movements on the map for touchscreen devices.
Nick is right, this discussion outlines a workable method: Google Maps V3 - How to calculate the zoom level for a given bounds
However, it is in Javascript. For those needing to do this with Android GMaps v3, the following is a translation:
private static final double LN2 = 0.6931471805599453;
private static final int WORLD_PX_HEIGHT = 256;
private static final int WORLD_PX_WIDTH = 256;
private static final int ZOOM_MAX = 21;
public int getBoundsZoomLevel(LatLngBounds bounds, int mapWidthPx, int mapHeightPx){
LatLng ne = bounds.northeast;
LatLng sw = bounds.southwest;
double latFraction = (latRad(ne.latitude) - latRad(sw.latitude)) / Math.PI;
double lngDiff = ne.longitude - sw.longitude;
double lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
double latZoom = zoom(mapHeightPx, WORLD_PX_HEIGHT, latFraction);
double lngZoom = zoom(mapWidthPx, WORLD_PX_WIDTH, lngFraction);
int result = Math.min((int)latZoom, (int)lngZoom);
return Math.min(result, ZOOM_MAX);
}
private double latRad(double lat) {
double sin = Math.sin(lat * Math.PI / 180);
double radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
private double zoom(int mapPx, int worldPx, double fraction) {
return Math.floor(Math.log(mapPx / worldPx / fraction) / LN2);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With