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.
Réponses
Trop de publicités?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.
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
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);
}
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
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.