105 votes

Google Maps v3 fitBounds() Zoom trop proche pour un seul marqueur

Existe-t-il un moyen de définir un niveau de zoom maximal pour fitBounds()?

Mon problème est que lorsque la carte ne reçoit qu'un seul emplacement, elle zoome autant que possible, ce qui sort vraiment la carte de son contexte et la rend inutile. Peut-être que j'adopte la mauvaise approche ?

2 votes

stackoverflow.com/questions/4523023/… est une solution bien meilleure. En particulier, la réponse de @Nequins.

147voto

Ryan Points 3492

J'aime la solution de mrt (surtout quand on ne sait pas combien de points seront cartographiés ou ajustés), sauf qu'elle déplace le marqueur de sorte qu'il ne soit plus au centre de la carte. Je l'ai simplement étendu en ajoutant un point supplémentaire en soustrayant .01 à la latitude et à la longitude également, afin de garder le marqueur au centre. Ça fonctionne très bien, merci mrt!

// Ajuster la carte pour afficher tous les marqueurs
function fitToMarkers(markers) {

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

    // Créer les limites à partir des marqueurs
    for( var index in markers ) {
        var latlng = markers[index].getPosition();
        bounds.extend(latlng);
    }

    // Ne pas zoomer trop près sur un seul marqueur
    if (bounds.getNorthEast().equals(bounds.getSouthWest())) {
       var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01);
       var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - 0.01, bounds.getNorthEast().lng() - 0.01);
       bounds.extend(extendPoint1);
       bounds.extend(extendPoint2);
    }

    map.fitBounds(bounds);

    // Ajustement du zoom ici ne fonctionne pas :/

}

5 votes

Bonne idée de garder le centre d'origine. La raison pour laquelle le niveau de zoom ne peut pas être ajusté de manière fiable lors de l'utilisation de la méthode fitBounds() est que le zoom se produit de manière asynchrone : stackoverflow.com/questions/2989858/…

1 votes

Ce travail était génial pour moi. J'ai dû passer la référence de la carte dans la fonction "function fitToMarkers(markers, map)" sur V3, mais ça marche comme un charme après ça!

4 votes

Aime ça. Bon conseil @ryan. Ça a bien marché pour moi, mais .01 dans mon cas a zoomé trop loin, .001 a été parfait.

48voto

Flygenring Points 1472

Vous pouvez configurer votre carte avec maxZoom dans les MapOptions (api-reference) comme ceci :

var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });

Cela empêcherait la carte de zoomer plus profondément lors de l'utilisation de fitBounds() et même supprimerait les niveaux de zoom du contrôle de zoom.

0 votes

@candlejack Donc exactement comme décrit dans ma réponse?

15 votes

Vous pouvez définir le maxZoom avant d'adapter les limites, puis le réinitialiser en utilisant map.setOptions({ maxZoom: undefined }) sur l'événement idle déclenché en modifiant les limites. Cela empêche l'effet de zoom avant et après du lieu de réinitialiser le zoom dans l'événement idle.

30voto

mrt Points 111

Une autre solution consiste à étendre les limites si vous détectez qu'elles sont trop petites avant d'exécuter fitBounds():

var bounds = new google.maps.LatLngBounds();
// ici vous étendez vos limites comme vous le souhaitez
// ...
if (bounds.getNorthEast().equals(bounds.getSouthWest())) {
   var extendPoint = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01);
   bounds.extend(extendPoint);
}
map.fitBounds(bounds);

19voto

markvaneijk Points 96
var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });

Utiliser l'option MaxZoom fonctionne mieux pour ne pas zoomer trop près des marques que vous avez.

0 votes

Fantastique! Sauveur de vie!

13voto

CrazyEnigma Points 1393

Si c'est pour un seul endroit, vous pouvez utiliser setCenter() et setZoom() à la place.

0 votes

Solution la plus simple

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