J'utilise fitBounds () pour définir le niveau de zoom sur ma carte et inclure tous les marqueurs actuellement affichés. Cependant, lorsque je n'ai qu'un seul marqueur visible, le niveau de zoom est de 100% (... quel niveau de zoom 20 je pense ...). Cependant, je ne souhaite pas que le zoom soit aussi avancé afin que l'utilisateur puisse ajuster la position du marqueur sans avoir à effectuer un zoom arrière.
J'ai le code suivant:
var marker = this.map.createMarker(view.latlng, this.markerNumber);
this.map.bounds.extend(view.latlng);
this.map.map.setCenter(this.map.bounds.getCenter());
this.map.map.fitBounds(this.map.bounds);
if (this.markerNumber === 1) {
this.map.map.setZoom(16);
}
this.markerNumber++;
où this.map.bounds était défini précédemment comme suit:
this.map.bounds = new google.maps.LatLngBounds();
Cependant, le problème que je rencontre est que la ligne this.map.map.setZoom(16);
ne fonctionne pas si j'utilise this.map.map.fitBounds(this.map.bounds);
. Cependant, je sais que cette ligne de code est correcte car lorsque je commente la ligne fitBound (), setZoom () commence à fonctionner comme par magie.
Des idées comment je résous ceci? Je songe à définir un niveau maxZoom comme solution de rechange si je ne parviens pas à le faire fonctionner.
Bon, je l'ai compris. Apparemment, fitbounds () se produit de manière asynchrone, vous devez donc attendre un événement bounds_changed
avant de pouvoir régler le zoom.
map = this.map.map;
map.fitBounds(this.map.bounds);
zoomChangeBoundsListener =
google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
if (this.getZoom()){
this.setZoom(16);
}
});
setTimeout(function(){google.maps.event.removeListener(zoomChangeBoundsListener)}, 2000);
Update : Voir la réponse de @ Nequin en utilisant addListenerOnce
pour une meilleure solution ne nécessitant pas de délai d'expiration.
google.maps.event.addListenerOnce(yourMap, 'bounds_changed', function(event) {
if (this.getZoom() > 15) {
this.setZoom(15);
}
});
Cette solution fonctionne mieux… au lieu d'attendre le délai d'attente pour supprimer l'auditeur. Appelez-le directement avant d’utiliser fitBounds
(je crois que l’appel après fonctionnera également).
J'ai trouvé le zoom supplémentaire un peu choquant. Si vous définissez l'option maxZoom avant d'appeler fitBounds (puis désélectionnez-la dans le rappel), vous pouvez l'éviter:
map.setOptions({
maxZoom: 10
});
map.setCenter(new google.maps.LatLng(-89, -179)); // make sure it changes so the idle listener gets called back
map.fitBounds(bounds);
var listener = google.maps.event.addListenerOnce(map, "idle", function()
{
map.setOptions({
maxZoom: 999
});
});
J'ai une solution simple et sale.
Utilisez sinon ...
var marker = this.map.createMarker(view.latlng, this.markerNumber);
this.map.bounds.extend(view.latlng);
this.map.map.setCenter(this.map.bounds.getCenter());
if (this.markerNumber === 1) {
this.map.map.setZoom(16);
} else {
this.map.map.fitBounds(this.map.bounds);
}
this.markerNumber++;
Je viens d'ajouter une ligne à la fonction addBounds(position)
et elle l'a corrigée, comme le montre ce qui suit:
addBounds: function(position) {
this.get('bounds', new google.maps.LatLngBounds()).extend(this._latLng(position));
this.get('map').fitBounds(this.get('bounds'));
this.get('map').setZoom(16);//line added
return this;
},
Je pense que la bonne façon de faire est de définir le niveau de zoom après map.fitBounds(bounds)
. Ajoutez simplement map.setZoom(16)
après map.fitBounds(bounds)
. Ça fonctionne bien pour moi.
Toutes les solutions avec des écouteurs d'événement ne fonctionnaient pas pour moi (this.getZoom () est toujours indéfini dans le rappel et this.setZoom () n'a aucun effet).
Je suis venu avec cette solution qui a bien fonctionné:
function set_zoom() {
if(map.getZoom()) {map.setZoom(map.getZoom() - 1);}
else {setTimeout(set_zoom, 5);}
}
setTimeout(set_zoom, 5);