Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate Zoom Level for Google Map for two LatLong values

I am using com.google.android.gms.maps.GoogleMap in SherlockFragmentActivity.

XML code is this :

            <fragment
                android:id="@+id/map"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="fill_parent"
                android:layout_height="150dip" />

int zoomLevel = ? // How I can calculate the zoom level for two diffrent latlong values as android map v3 need to tell zoom level as int

map.setZoom(zoomLevel);

I have start and destination values as com.google.android.gms.maps.model.LatLng

LatLng start , end;

I am adding a pligon like GoogleLocation.addPolyLineOnGMap(mMap, startPoint, endPoint, startMarker, endMarker)

My problem is how I can calculate zoom level for Google map so it can show both marker appropriately on map.

like image 983
M. Usman Afzal Avatar asked Sep 06 '13 16:09

M. Usman Afzal


Video Answer


2 Answers

Use LatLngBounds.Builder add all the bounds in it and build it, Then create the CameraUpdate object and pass the bounds in it updatefactory with padding. Use this CameraUpdate object to animate the map camera.

LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (Marker m : markers) {
            builder.include(m.getPosition());
        }
        LatLngBounds bounds = builder.build();
        int padding = ((width * 10) / 100); // offset from edges of the map
                                            // in pixels
        CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds,
                padding);
        mMap.animateCamera(cu);
like image 93
Nikunj Sakhrelia Avatar answered Nov 15 '22 05:11

Nikunj Sakhrelia


For me, i need to calculate the zoom for initial map setup by GoogleMapOptions, so using LatLngBounds.Builder would not work and not optimized. This is how I calculate the zoom based on a city's northeast and southwest coordinates

It's referencing here and this answer, you can simply put the code below to your helper class:

final static int GLOBE_WIDTH = 256; // a constant in Google's map projection
final static int ZOOM_MAX = 21;

public static int getBoundsZoomLevel(LatLng northeast,LatLng southwest,
                                     int width, int height) {
    double latFraction = (latRad(northeast.latitude) - latRad(southwest.latitude)) / Math.PI;
    double lngDiff = northeast.longitude - southwest.longitude;
    double lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
    double latZoom = zoom(height, GLOBE_WIDTH, latFraction);
    double lngZoom = zoom(width, GLOBE_WIDTH, lngFraction);
    double zoom = Math.min(Math.min(latZoom, lngZoom),ZOOM_MAX);
    return (int)(zoom);
}
private static 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 static double zoom(double mapPx, double worldPx, double fraction) {
    final double LN2 = .693147180559945309417;
    return (Math.log(mapPx / worldPx / fraction) / LN2);
}

Creating LatLng simply by new LatLng(lat-double, lng-double)

width and height is the map layout size in pixels

like image 26
Nicholas Ng Avatar answered Nov 15 '22 05:11

Nicholas Ng