J'ai un ensemble de points que je veux tracer sur une carte Google intégrée (API v3). J'aimerais que les limites tiennent compte de tous les points, sauf si le niveau de zoom est trop bas (c.-à-d. Trop dézoomé). Mon approche a été comme ceci:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Ça ne marche 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?
Réponses:
Edit : Voir le commentaire de Matt Diamond ci-dessous.
Je l'ai! Essaye ça:
Modifiez selon vos besoins.
la source
J'ai résolu un problème similaire dans l'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 j'avais ...
Dans mon application, je voulais tracer un ou plusieurs marqueurs et m'assurer que la carte les montrait tous. Le problème était que si je comptais uniquement sur la méthode fitBounds, le niveau de zoom serait maximisé lorsqu'il y avait un seul point - ce n'était pas bon.
La solution était d'utiliser fitBounds quand il y avait beaucoup de points, et setCenter + setZoom quand il n'y avait qu'un seul point.
la source
Je suis venu plusieurs fois sur cette page pour obtenir la réponse, et bien que toutes les réponses existantes aient été super utiles, elles n'ont pas résolu mon problème exactement.
Fondamentalement, j'ai trouvé que l'événement «zoom_changed» empêchait l'interface utilisateur de la carte de «sauter», ce qui s'est produit lorsque j'ai attendu l'événement «inactif».
J'espère que cela aide quelqu'un!
la source
fitBounds()
si vous utilisezzoom_changed
bounds_changed
, car ilzoom_changed
n'a pas besoin d'être déclenché dans le cas où onfitBounds
garde le niveau de zoom. Ma tentative jsfiddle.net/rHeMp/10 ne le confirme pas, mais il ne faut pas se fier à un comportement non défini.Je viens de résoudre ce problème en définissant maxZoom à l'avance, puis en le supprimant par la suite. Par exemple:
la source
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 accompli cela en initialisant le niveau de zoom de la carte à 16 (je ne sais pas si c'est le niveau de zoom le plus élevé possible sur V3).
Ensuite, j'ai fait les trucs des limites:
Résultat: succès!
la source
J'utilise:
Cela utilisera le plus petit de 24 et le niveau de zoom nécessaire en fonction de votre code, mais cela modifie probablement le zoom de toute façon et ne se soucie pas de la quantité de zoom arrière.
la source
Veuillez essayer ceci:
la source
J'ai eu le même problème et j'ai pu le résoudre en utilisant le code suivant. Cet
google.maps.addListenerOnce()
événement listener ( ) ne sera déclenché qu'une seule fois, juste aprèsmap.fitBounds()
son exécution. Il n'est donc pas nécessaire deidle
.Il définit initialement le niveau de zoom approprié et permet à l'utilisateur d'effectuer un zoom avant et arrière au-delà du niveau de zoom initial car l'écouteur d'événements a expiré. Par exemple, si seulement
google.maps.addListener()
était appelé, l'utilisateur ne pourrait jamais zoomer au-delà du niveau de zoom indiqué (dans le cas, 4). Depuis que nous l'avons implémentégoogle.maps.addListenerOnce()
, l'utilisateur pourra zoomer à n'importe quel niveau de son choix.la source
Eu le même problème, avait besoin de tenir de nombreux marqueurs sur la carte. Cela a résolu mon cas:
bounds.extend(objLatLng)
)Exécutez les fitbounds APRÈS que la carte soit terminée:
la source
J'ai trouvé une solution qui vérifie avant d'appeler
fitBounds
afin de ne pas faire de zoom avant ni de zoom arrière soudainVous devrez jouer un peu avec la variable minLatSpan pour l'amener où vous le souhaitez. Il variera en fonction du niveau de zoom et des dimensions du canevas de carte.
Vous pouvez également utiliser la longitude au lieu de la latitude
la source
J'ai vu de nombreuses solutions incorrectes ou trop compliquées, j'ai donc décidé de publier une solution fonctionnelle et élégante .
La raison pour laquelle
setZoom()
cela ne fonctionne pas comme vous vous y attendez est qu'ilfitBounds()
est asynchrone, donc cela ne donne aucune garantie qu'il mettra immédiatement à jour le zoom, mais votre appel àsetZoom()
s'appuie sur cela.Ce que vous pourriez envisager est de définir l'
minZoom
option de carte avant d'appelerfitBounds()
, puis de la désactiver une fois qu'elle est terminée (afin que les utilisateurs puissent toujours effectuer un zoom arrière manuellement s'ils le souhaitent):De plus, si vous souhaitez également limiter le zoom max, vous pouvez appliquer la même astuce avec la
maxZoom
propriété.Voir les documents MapOptions .
la source
Je l'utilise pour m'assurer que le niveau de zoom ne dépasse pas un niveau défini afin que je sache que des images satellites seront disponibles.
Ajoutez un écouteur à l'
zoom_changed
événement. Cela a l'avantage supplémentaire de contrôler également la commande de zoom sur l'interface utilisateur.Exécutez uniquement
setZoom
si vous en avez besoin, donc uneif
instruction est préférable àMath.max
ou àMath.min
Pour éviter de trop dézoomer:
la source
Dans cette fonction, vous devez ajouter dynamiquement des métadonnées pour stocker le type de géométrie uniquement parce que la fonction accepte n'importe quelle géométrie.
"fitGeometries" est une fonction JSON qui étend un objet de carte.
"geometries" est un tableau javascript générique et non un MVCArray ().
la source
ce travail est pour moi avec l'API v3 mais avec un zoom fixe:
la source
Comme moi, si vous n'êtes pas prêt à jouer avec des auditeurs, voici une solution simple que j'ai trouvée: Ajoutez une méthode sur la carte qui fonctionne strictement selon vos besoins comme celle-ci:
alors vous pouvez appeler
map.fitLmtdBounds(bounds)
au lieu demap.fitBounds(bounds)
pour définir les limites sous la plage de zoom définie ... oumap.fitLmtdBounds(bounds,3,5)
pour remplacer la plage de zoom ..la source
Veuillez essayer ceci.
Si cela vous sera utile.
Bonne chance
la source
Après le calcul des limites, vous pouvez vérifier la distance entre le coin supérieur gauche et le coin inférieur droit; alors vous pouvez comprendre le niveau de zoom en testant la distance (si la distance est trop éloignée, le niveau de zoom serait bas), vous pouvez sélectionner plus à l'aide de la méthode setbound ou setZoom ..
la source
Je n'aime pas le suggérer, mais si vous devez essayer - premier appel
gmap.fitBounds(bounds);
Ensuite, créez un nouveau Thread / AsyncTask, laissez-le dormir pendant 20 à 50 ms environ, puis appelez
gmap.setZoom( Math.max(6, gmap.getZoom()) );
à partir du thread d'interface utilisateur (utilisez un gestionnaire ou la
onPostExecute
méthode pour AsyncTask).Je ne sais pas si cela fonctionne, juste une suggestion. En dehors de cela, vous devrez calculer vous-même le niveau de zoom à partir de vos points, vérifier s'il est trop bas, le corriger, puis appeler
gmap.setZoom(correctedZoom)
la source
Si «bounds_changed» ne se déclenche pas correctement (parfois, Google ne semble pas accepter parfaitement les coordonnées), envisagez plutôt d'utiliser «center_changed».
L'événement 'center_changed' se déclenche chaque fois que fitBounds () est appelé, bien qu'il s'exécute immédiatement et pas nécessairement après le déplacement de la carte.
Dans des cas normaux, «inactif» est toujours le meilleur écouteur d'événements, mais cela peut aider quelques personnes à rencontrer des problèmes étranges avec leurs appels fitBounds ().
Voir le rappel de Google Maps fitBounds
la source
Pour jouer avec une autre solution - j'ai trouvé que l'approche «écouter les événements bounds_changed et ensuite définir un nouveau zoom» ne fonctionnait pas de manière fiable pour moi. Je pense que
fitBounds
j'appelais parfois avant que la carte n'ait été complètement initialisée, et l'initialisation provoquait un événement bounds_changed qui utiliserait l'écouteur, avant defitBounds
changer les limites et le niveau de zoom. Je me suis retrouvé avec ce code, qui semble fonctionner jusqu'à présent:la source
Pour moi, la solution la plus simple était la suivante:
la source
la source
Tout ce que j'ai fait c'est:
Et cela fonctionne sur l'API V3.
la source