315 votes

Android map v2 zoomer pour afficher tous les marqueurs

J'ai 10 marqueurs dans le GoogleMap . Je veux zoomer le plus possible et garder tous les marqueurs en vue ? Dans la version précédente, il est possible de le faire à partir de zoomToSpan() mais dans la v2, je n'ai aucune idée de la manière de procéder. De plus, je connais le rayon du cercle qui doit être visible.

5voto

Jyotman Singh Points 4601

Note - Il ne s'agit pas d'une solution à la question initiale. Il s'agit d'une solution à l'un des sous-problèmes discutés. ci-dessus .

Solution à @andr Clarification 2 -

C'est vraiment problématique lorsqu'il n'y a qu'un seul marqueur dans les limites et que, pour cette raison, le niveau de zoom est fixé à un niveau très élevé ( niveau 21 ). Et Google ne fournit aucun moyen de définir le niveau de zoom maximum à ce stade. Cela peut également se produire lorsqu'il y a plus d'un marqueur, mais qu'ils sont tous assez proches les uns des autres. Le même problème se pose alors.

Solution - Supposons que vous souhaitiez que votre carte ne dépasse jamais le niveau de zoom 16. Ensuite, après avoir fait -

CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
mMap.moveCamera(cu);

Vérifiez si votre niveau de zoom a dépassé le niveau 16 (ou ce que vous voulez) -

float currentZoom = mMap.getCameraPosition().zoom;

Si ce niveau est supérieur à 16, ce qui n'est le cas que s'il y a très peu de marqueurs ou si tous les marqueurs sont très proches les uns des autres, il suffit de dézoomer la carte à cet endroit précis en réglant le niveau de zoom sur 16.

mMap.moveCamera(CameraUpdateFactory.zoomTo(16));

De cette façon, vous n'aurez jamais le problème du niveau de zoom "bizarre" expliqué très bien par @andr également.

5voto

Amit Tumkur Points 1016

Cela pourrait aider à partir des démonstrations d'apis de Google

private List<Marker> markerList = new ArrayList<>();
Marker marker = mGoogleMap.addMarker(new MarkerOptions().position(geoLatLng)
                .title(title));
markerList.add(marker);
    // Pan to see all markers in view.
    // Cannot zoom to bounds until the map has a size.
    final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
    if (mapView!=null) {
        if (mapView.getViewTreeObserver().isAlive()) {
            mapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @SuppressWarnings("deprecation") // We use the new method when supported
                @SuppressLint("NewApi") // We check which build version we are using.
                @Override
                public void onGlobalLayout() {
                    //Calculate the markers to get their position
                    LatLngBounds.Builder b = new LatLngBounds.Builder();
                    for (Marker m : markerList) {
                        b.include(m.getPosition());
                    }
                    // also include current location to include in the view
                    b.include(new LatLng(mLocation.getLatitude(),mLocation.getLongitude()));

                    LatLngBounds bounds = b.build();
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
                }
            });
        }
    }

pour plus d'informations, consultez ce site. https://github.com/googlemaps/Android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java

3voto

Sathish kumar T.M Points 167

Afficher tous les marqueurs avec Google map

Ces méthodes permettent de stocker tous les marqueurs et d'effectuer un zoom automatique pour afficher tous les marqueurs sur la carte Google.

// Declare the Markers List.
List<MarkerOptions> markerList;
private BitmapDescriptor vnrPoint,banPoint;

public void storeAllMarkers()
{
      markerList=new ArrayList<>();
      markerList.removeAll(markerList);

      // latitude and longitude of Virudhunagar

      double latitude1=9.587209;
      double longitude1=77.951431;
   vnrPoint=BitmapDescriptorFactory.fromResource(R.drawable.location_icon_1);
      LatLng vnr = new LatLng(latitude1, longitude1);
      MarkerOptions vnrMarker = new MarkerOptions();
      vnrMarker.position(vnr);
      vnrMarker.icon(vnrPoint);
      markerList.add(vnrMarker);

      // latitude and longitude of Bengaluru

      double latitude2=12.972442;
      double longitude2=77.580643;

    banPoint=BitmapDescriptorFactory.fromResource(R.drawable.location_icon_2);

      LatLng ban = new LatLng(latitude2, longitude2);
      MarkerOptions bengalureMarker = new MarkerOptions();
      bengalureMarker.position(ban);
      bengalureMarker.icon(banPoint);
      markerList.add(bengalureMarker);

      // You can add any numbers of MarkerOptions like this.

     showAllMarkers();

 }

public void showAllMarkers()
{
    LatLngBounds.Builder builder = new LatLngBounds.Builder();

    for (MarkerOptions m : markerList) {
        builder.include(m.getPosition());
    }

    LatLngBounds bounds = builder.build();

    int width = getResources().getDisplayMetrics().widthPixels;
    int height = getResources().getDisplayMetrics().heightPixels;
    int padding = (int) (width * 0.30); 

    // Zoom and animate the google map to show all markers

    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
    googleMap.animateCamera(cu);
}

1voto

J'ai eu un problème similaire, l'utilisation du code suivant a résolu le problème :

CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5) dans mon cas, les différences de localisation ne sont généralement pas plus importantes que deux villes voisines.

zoom pour ajuster tous les marqueurs sur la carte google maps v2

1voto

Anuj Jindal Points 33

J'ai une autre méthode pour faire la même chose qui fonctionne parfaitement. L'idée est donc d'afficher tous les marqueurs sur l'écran et d'avoir un centre lat long et un niveau de zoom. Voici la fonction qui vous donnera les deux et qui a besoin de tous les objets Latlng du marqueur comme entrée.

 public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) {
    float max = 0;

    if (l == null || l.length == 0) {
        return null;
    }
    LatLngBounds.Builder b = new LatLngBounds.Builder();
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        b.include(l[count]);
    }

    LatLng center = b.build().getCenter();

    float distance = 0;
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        distance = distance(center, l[count]);
        if (distance > max) {
            max = distance;
        }
    }

    double scale = max / 1000;
    int zoom = ((int) (16 - Math.log(scale) / Math.log(2)));
    return new Pair<LatLng, Integer>(center, zoom);
}

Cette fonction renvoie un objet Pair que vous pouvez utiliser comme

Pair pair = getCenterWithZoomLevel(l1,l2,l3..) ; mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pair.first, pair.second)) ;

au lieu d'utiliser le padding pour éloigner les marqueurs des limites de l'écran, vous pouvez ajuster le zoom par -1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X