Search code examples
androidzoominggoogle-maps-android-api-2marker

zoom to fit all markers on map google maps v2


I want to set the map zoom level to fit all markers on the map. I have used following method as said by many people, but it is not working for me. It is displaying some other point.

if (positions.size() > 0) {

    final LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker m : positions) {
        builder.include(m.getPosition());
    }
    builder.include(positions.get(i).getPosition());
}

try {
    googleMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {

            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(
                    builder.build(), UserDataManager.getInstance().getWidth(), 
                    UserDataManager.getInstance().getWidth(),0));
            googleMap.setOnCameraChangeListener(null);

        }
    });

} catch (IllegalStateException e) {
    // TODO: handle exception
    final View mapView = getSupportFragmentManager()
            .findFragmentById(R.id.map).getView();
    if (mapView.getViewTreeObserver().isAlive()) {
        mapView.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

                // We check which build version we are using.
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        mapView.getViewTreeObserver()
                                .removeGlobalOnLayoutListener(
                                        this);
                    } else {
                        mapView.getViewTreeObserver()
                                .removeOnGlobalLayoutListener(
                                        this);
                    }

                    googleMap.setOnCameraChangeListener(new OnCameraChangeListener() {

                        @Override
                        public void onCameraChange(CameraPosition arg0) {

                            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(
                                    builder.build(), 
                                    UserDataManager.getInstance().getWidth(), 
                                    UserDataManager.getInstance().getWidth(),0));
                            googleMap.setOnCameraChangeListener(null);

                        }
                    });

                }
            });
        }
    }
}

Solution

  • Try using this

    //Calculate the markers to get their position
    LatLngBounds.Builder b = new LatLngBounds.Builder();
    for (Marker m : markers) {
        b.include(m.getPosition());
    }
    LatLngBounds bounds = b.build();
    //Change the padding as per needed
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 25,25,5);
    mMap.animateCamera(cu);
    

    Check this Google Maps v2 library that i have created that includes this functionality just use

    Marker m1,m2, m3, m4 .... ;
    
    mapHelper.zoomToFitMarkers(m1,m2, m3, m4 ....);
    

    EDIT :

    Get current location

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //You can use GPS_PROVIDER also
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onProviderEnabled(String provider) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onLocationChanged(Location location) {
                // TODO Auto-generated method stub
                currentLatitude = location.getLatitude();
                currentLongitude = location.getLongitude();
                //Add your marker here and zoom to fit it
                //mapHelper.zoomToFitMarkers(m1,m2, m3, m4,mapHelper.addMarker(currentLatitude,currentLongitude,"Current Location"););
            }
        });