214 votes

API Google Maps v3 : puis-je définir un zoom après fitBounds ?

Je dispose d'un ensemble de points que je souhaite représenter sur une carte Google Map intégrée (API v3). J'aimerais que les limites puissent accueillir tous les points, sauf si le niveau de zoom est trop faible (c'est-à-dire si le zoom arrière est trop important). Mon approche a été la suivante :

var bounds = new google.maps.LatLngBounds();

// extend bounds with each point

gmap.fitBounds(bounds); 
gmap.setZoom( Math.max(6, gmap.getZoom()) );

Cela ne fonctionne pas. La dernière ligne "gmap.setZoom()" ne change pas le niveau de zoom de la carte si elle est appelée directement après fitBounds.

Existe-t-il un moyen d'obtenir le niveau de zoom d'une limite sans l'appliquer à la carte ? D'autres idées pour résoudre ce problème ?

2 votes

Voir stackoverflow.com/questions/4523023/using-setzoom-after-using-fitbounds-with-google-maps-api-v3

362voto

LGT Points 2051

Modifier : Voir le commentaire de Matt Diamond ci-dessous.

Je l'ai eu ! Essaie ça :

map.fitBounds(bounds);
var listener = google.maps.event.addListener(map, "idle", function() { 
  if (map.getZoom() > 16) map.setZoom(16); 
  google.maps.event.removeListener(listener); 
});

Adapté à vos besoins.

81 votes

Excellente solution, qui m'a évité bien des soucis. Je voulais juste ajouter que vous pourriez simplifier encore plus les choses en utilisant la méthode addListenerOnce... de cette façon, vous n'avez pas besoin de sauvegarder le listener et de le supprimer manuellement, car la méthode s'en chargera pour vous.

9 votes

Cela a pour effet de voir la carte "sauter". Il faut plutôt écouter l'événement "zoom_change" et le configurer avant d'appeler fitBounds(). Voir ma réponse ci-dessous

1 votes

Merci ! google.maps.event.addListenerOnce(map, "idle", function() { } --> a très bien fonctionné pour mon paquet de cartes pour SugarCRM.

76voto

Jim Garvin Points 3318

J'ai résolu un problème similaire dans une de mes applications. J'étais un peu confus par votre description du problème, mais je pense que vous avez le même objectif que moi...

Dans mon application, je voulais tracer un ou plusieurs marqueurs et m'assurer que la carte les affichait tous. Le problème était que, si je me fiais uniquement à la méthode fitBounds, le niveau de zoom serait maximisé lorsqu'il n'y aurait qu'un seul point - ce qui n'était pas bon.

La solution consistait à utiliser fitBounds lorsqu'il y avait plusieurs points, et setCenter+setZoom lorsqu'il n'y avait qu'un seul point.

if (pointCount > 1) {
  map.fitBounds(mapBounds);
}
else if (pointCount == 1) {
  map.setCenter(mapBounds.getCenter());
  map.setZoom(14);
}

5 votes

Votre réponse a résolu mon problème avec Google Maps V3. Merci !

0 votes

J'ai essayé la même approche par moi-même, mais cela n'a pas fonctionné parce que je n'invoquais pas setCenter() avant de définir le zoom... Je me demande toujours pourquoi cette étape est nécessaire, mais de toute façon, maintenant ça marche... merci beaucoup Jim !

0 votes

C'est une bonne chose car vous n'avez pas à gérer le saut d'animation de la réponse acceptée.

46voto

Benjamin Sussman Points 508

Je suis venu sur cette page plusieurs fois pour obtenir la réponse, et même si toutes les réponses existantes étaient super utiles, elles ne résolvaient pas exactement mon problème.

google.maps.event.addListenerOnce(googleMap, 'zoom_changed', function() {
    var oldZoom = googleMap.getZoom();
    googleMap.setZoom(oldZoom - 1); //Or whatever
});

En fait, j'ai découvert que l'événement "zoom_changed" empêchait l'interface utilisateur de la carte de "sauter", ce qui se produisait lorsque j'attendais l'événement "idle".

J'espère que cela aidera quelqu'un !

4 votes

Excellent, j'avais aussi le comportement de "saut / zoom automatique". Juste une note pour les autres lecteurs : assurez-vous d'utiliser "addListenerOnce" comme Benjamin le fait ci-dessus au lieu de "addListener", ou cassez-vous la tête sur pourquoi votre navigateur plante tout le temps ;-)

7 votes

Notez également que l'écouteur doit être ajouté avant d'appeler fitBounds() si vous utilisez zoom_changed

1 votes

Merci pour cela, il semble que la v4 devrait avoir un fitBounds(bounds,minZoomLevel) :)

4voto

koderoid Points 121

Si je ne me trompe pas, je suppose que vous voulez que tous vos points soient visibles sur la carte avec le niveau de zoom le plus élevé possible. J'ai réalisé cela en initialisant le niveau de zoom de la carte à 16 (je ne sais pas si c'est le plus haut niveau de zoom possible sur V3).

var map = new google.maps.Map(document.getElementById('map_canvas'), {
  zoom: 16,
  center: marker_point,
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

Puis après ça, j'ai fait le truc des limites :

var bounds = new google.maps.LatLngBounds();

// You can have a loop here of all you marker points
// Begin loop
bounds.extend(marker_point);
// End loop

map.fitBounds(bounds);

Résultat : Succès !

3voto

ytg Points 575

J'utilise :

gmap.setZoom(24); //this looks a high enough zoom value
gmap.fitBounds(bounds); //now the fitBounds should make the zoom value only less

Cela utilisera la plus petite valeur de 24 et le niveau de zoom nécessaire en fonction de votre code, mais il est probable qu'il modifie le zoom de toute façon et qu'il ne se soucie pas de l'ampleur du zoom arrière.

0 votes

Je déteste dire ça, mais aussi bizarre que cette réponse puisse paraître, c'est la seule chose qui a fonctionné jusqu'à présent et j'ai cherché pendant 4-5 heures sur une période de 3 jours. Je vais quand même continuer à chercher une meilleure solution.

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