6

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.

M. Usman Afzal
  • 103
  • 1
  • 2
  • 8

3 Answers3

17

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);
Nikunj Sakhrelia
  • 449
  • 3
  • 12
5

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

Community
  • 1
  • 1
Nicholas Ng
  • 1,428
  • 18
  • 23
  • Note: `width` and `height` need to be measured in density pixels, not plain pixels, or the zoom level will be incorrect on newer devices with higher-density screens. – Mad Scientist Moses Jul 02 '19 at 18:51
1

in Android:

LatLngBounds group = new LatLngBounds.Builder()
                .include(tokio)   // LatLgn object1
                .include(sydney)  // LatLgn object2
                .build();

mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(group, 100)); // Set Padding and that's all!