Android map v2 zoom pour afficher tous les marqueurs

J'ai 10 marqueurs dans GoogleMap . Je souhaite zoomer autant que possible et garder tous les marqueurs en vue? Dans la version antérieure, cela peut être obtenu à partir de zoomToSpan() mais en v2, je n'ai aucune idée de la façon de le faire. De plus, je connais le rayon du cercle qui doit être visible.

  • La messagerie Cloud Firebase a remplacé les clés du serveur par des jetons pour l'envoi de notifications / messages
  • Connexion automatique Bluetooth avec périphériques appariés
  • Toutes les bibliothèques com.android.support doivent utiliser la même version exacte
  • Comment faire pour arrondir des nombres décimaux dans Android
  • Comment réduire la taille APK Android?
  • Set <String> dans les préférences partagées Android ne permet pas d'enregistrer sur la force close
  • 10 Solutions collect form web for “Android map v2 zoom pour afficher tous les marqueurs”

    Vous devez utiliser la classe CameraUpdate pour effectuer (probablement) tous les mouvements de la carte programmée.

    Pour ce faire, commencez par calculer les limites de tous les marqueurs comme suit:

     LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (Marker marker : markers) { builder.include(marker.getPosition()); } LatLngBounds bounds = builder.build(); 

    Ensuite, obtenez un objet de description de mouvement en utilisant l'usine: CameraUpdateFactory :

     int padding = 0; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); 

    Finalement, déplacez la carte:

     googleMap.moveCamera(cu); 

    Ou si vous voulez une animation:

     googleMap.animateCamera(cu); 

    C'est tout 🙂

    Clarification 1

    Presque toutes les méthodes de mouvement nécessitent que l'objet Map ait dépassé le processus de mise en page. Vous pouvez attendre que cela se produise en utilisant la construction addOnGlobalLayoutListener . Vous trouverez des détails dans les commentaires sur cette réponse et les réponses restantes. Vous pouvez également trouver un code complet pour définir l'étendue de la carte en utilisant addOnGlobalLayoutListener ici .

    Clarification 2

    Un commentaire note que l'utilisation de cette méthode pour un seul marqueur résulte en un zoom cartographique pour un niveau de zoom "bizarre" (ce qui, je crois, est le niveau de zoom maximum disponible pour un emplacement donné). Je pense que cela est attendu car:

    1. L' LatLngBounds bounds aura une propriété northeastnortheast égale au southwestsouthwest , ce qui signifie que la partie de la surface de la Terre couverte par ces bounds est exactement nulle. (Ceci est logique car un seul marqueur n'a pas de zone.)
    2. En passant des bounds à CameraUpdateFactory.newLatLngBounds vous demandez essentiellement un calcul d'un tel niveau de zoom qui bounds (ayant une zone zéro) couvrant toute la vue de la carte.
    3. Vous pouvez effectivement effectuer ce calcul sur un morceau de papier. Le niveau de zoom théorique qui est la réponse est + ∞ (infini positif). En pratique, l'objet Map ne prend pas en charge cette valeur, de sorte qu'il soit serré à un niveau maximum plus raisonnable autorisé pour un emplacement donné.

    Une autre façon de le dire: comment Map sait-il quel niveau de zoom devrait-il choisir pour un seul emplacement ? Peut-être que la valeur optimale devrait être 20 (si elle représente une adresse spécifique). Ou peut-être 11 (si cela représente une ville). Ou peut-être 6 (si cela représente un pays). L'API n'est pas si judicieux et la décision dépend de vous.

    Donc, vous devez simplement vérifier si les markers n'ont qu'un seul emplacement et, si c'est le cas, utilisez l'un des:

    • CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition()) – passez à la position du marqueur, laissez le niveau de zoom actuel intact.
    • CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F) – passez à la position du marqueur, définissez le niveau de zoom à la valeur arbitraire choisie 12.

    Google Map V2: Zoom MarkerOptions dans les limites Meilleure solution de travail pour Android Marshmallow 6 (API 23, API 24, API 25) ainsi,

     LatLngBounds.Builder builder = new LatLngBounds.Builder(); //the include method will calculate the min and max bound. builder.include(marker1.getPosition()); builder.include(marker2.getPosition()); builder.include(marker3.getPosition()); builder.include(marker4.getPosition()); LatLngBounds bounds = builder.build(); int width = getResources().getDisplayMetrics().widthPixels; int height = getResources().getDisplayMetrics().heightPixels; int padding = (int) (width * 0.10); // offset from edges of the map 10% of screen CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding); mMap.animateCamera(cu); 

    Alors

    Je devais utiliser addOnGlobalLayoutListener pour obtenir l'échantillon approprié

    Par exemple, votre Google Map se trouve à l'intérieur de RelativeLayout:

     RelativeLayout mapLayout = (RelativeLayout)findViewById(R.id.map_layout); mapLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //and write code, which you can see in answer above } }); 

    Je ne pouvais pas utiliser l'onGlobalLayoutlistener, alors voici une autre solution pour empêcher que "Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions." Erreur:

     mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 15)); } }); 

    Je travaille bien pour moi.

    À partir de ce code, je affiche plusieurs marqueurs avec un zoom particulier sur l'écran de la carte.

    // Variables déclarées

     private LatLngBounds bounds; private LatLngBounds.Builder builder; 

    // Méthode d'ajout de plusieurs marqueurs avec icône dessiné

     private void drawMarker(LatLng point, String text) { MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(point).title(text).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)); mMap.addMarker(markerOptions); builder.include(markerOptions.getPosition()); } 

    // Pour ajouter plusieurs marqueurs visibles sur la carte

     @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; builder = new LatLngBounds.Builder(); for (int i = 0; i < locationList.size(); i++) { drawMarker(new LatLng(Double.parseDouble(locationList.get(i).getLatitude()), Double.parseDouble(locationList.get(i).getLongitude())), locationList.get(i).getNo()); } bounds = builder.build(); CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0); mMap.animateCamera(cu); 

    Note – Ce n'est pas une solution à la question initiale. Il s'agit d'une solution à l'un des sous-problèmes décrits ci – dessus .

    Solution à @andr Clarification 2

    C'est vraiment problématique quand il n'y a qu'un seul marqueur dans les limites et en raison de cela, le niveau de zoom est réglé sur un niveau très élevé ( niveau 21 ). Et Google ne fournit aucun moyen de définir le niveau de zoom maximal à ce stade. Cela peut également se produire lorsqu'il y a plus d'un marqueur, mais ils sont tous très proches l'un de l'autre. Ensuite, le même problème se produira également.

    Solution – Supposons 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 franchi le niveau 16 (ou ce que vous voulez) –

     float currentZoom = mMap.getCameraPosition().zoom; 

    Et si ce niveau est supérieur à 16, ce ne sera que s'il y a beaucoup moins de marqueurs ou tous les marqueurs sont très proches l'un de l'autre, puis réduisez simplement votre carte à cette position particulière en réglant le niveau de zoom à 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 aussi.

    Utilisez la méthode "getCenterCoordinate" pour obtenir la coordonnée centrale et l'utiliser dans CameraPosition.

     private void setUpMap() { mMap.setMyLocationEnabled(true); mMap.getUiSettings().setScrollGesturesEnabled(true); mMap.getUiSettings().setTiltGesturesEnabled(true); mMap.getUiSettings().setRotateGesturesEnabled(true); clientMarker = mMap.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(-12.1024174), Double.valueOf(-77.0262274))) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_taxi)) ); clientMarker = mMap.addMarker(new MarkerOptions() .position(new LatLng(Double.valueOf(-12.1024637), Double.valueOf(-77.0242617))) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_location)) ); camPos = new CameraPosition.Builder() .target(getCenterCoordinate()) .zoom(17) .build(); camUpd3 = CameraUpdateFactory.newCameraPosition(camPos); mMap.animateCamera(camUpd3); } public LatLng getCenterCoordinate(){ LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(new LatLng(Double.valueOf(-12.1024174), Double.valueOf(-77.0262274))); builder.include(new LatLng(Double.valueOf(-12.1024637), Double.valueOf(-77.0242617))); LatLngBounds bounds = builder.build(); return bounds.getCenter(); } 

    Cela aiderait .. à partir de google apis demos

     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 une information claire, regardez cette URL. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java

    J'ai eu un problème similaire, en utilisant le code suivant, j'ai résolu le problème:

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

    Zoom pour s'adapter à tous les marqueurs sur la carte google maps v2

      //For adding a marker in Google map MarkerOptions mp = new MarkerOptions(); mp.position(new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))); mp.snippet(strAddress); map.addMarker(mp); try { b = new LatLngBounds.Builder(); if (MapDetailsList.list != null && MapDetailsList.list.size() > 0) { for (int i = 0; i < MapDetailsList.list.size(); i++) { b.include(new LatLng(Double.parseDouble(MapDetailsList.list.get(i).getLatitude()), Double.parseDouble(MapDetailsList.list.get(i).getLongitude()))); } LatLngBounds bounds = b.build(); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int width = displayMetrics.widthPixels; int height = displayMetrics.heightPixels; // Change the padding as per needed CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width-200, height-200, 5); // map.setCenter(bounds.getCenter()); map.animateCamera(cu); } } catch (Exception e) { } 

    http://i64.tinypic.com/2qjybh4.png

    http://i63.tinypic.com/flzwus.png

    http://i63.tinypic.com/112g5fm.png

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.