2010-07-23 25 views
20

J'ai une superposition qui est générée dynamiquement à partir des données de l'utilisateur, j'ai donc besoin de savoir comment trouver le centre de cette superposition.API Google Maps: Calculer le centre/le zoom de la polyligne

Actuellement, j'utilise simplement les premières coordonnées de la superposition, mais cela ne représente pas vraiment le centre de la superposition. Par conséquent, lorsque je charge la carte, elle n'est pas centrée sur la superposition.

Est-ce que quelqu'un a une bonne méthode pour centrer la carte sur la superposition, en calculant le centre, pas en le codant?

var latlng = new google.maps.LatLng(38.269239, -122.276010); 
    var myOptions = { 
     zoom: 15,//Calculate this somehow? 
     center: latlng,// Calculate value from array of coordinates? 
     mapTypeId: google.maps.MapTypeId.HYBRID 
    }; 

Répondre

78

Si vous avez une liste de coordonnées, vous pouvez passer en boucle et de les ajouter à un objet LatLngBounds. Voici un exemple pour l'API V3, mais le concept V2 est similaire:

var bounds = new google.maps.LatLngBounds(); 
for (var i = 0; i < coordinates.length; i++) { 
    bounds.extend(coordinates[i]); 
} 

Après cela, vous pouvez obtenir le centre avec:

bounds.getCenter(); 

Ou bien, vous pouvez appeler map.fitBounds() directement, qui va centrer la carte autour du centre des limites et ajuster le zoom, de sorte que les limites entières s'insèrent exactement dans le port de vue.

map.fitBounds(bounds); 
+0

Vous êtes génial! Merci, cela a fonctionné juste comme j'avais besoin! –

+0

Est-ce que cette même méthode peut être utilisée pour calculer le zoom? –

+0

Utilisez simplement la position et le niveau de zoom que vous voulez pendant l'initialisation et appelez 'map.fitBounds (bounds);' après, comme décrit. Si vous voulez appliquer un niveau de zoom maximum, vous devrez enregistrer un 'zoomChangeBoundsListener' temporairement. Dites-moi si vous avez besoin d'un exemple pour ça aussi. – tux21b

2

La fonction getCenter de LatLngBounds ne fournit pas toujours un point DANS la polyligne. Il semble que l'algorithme utilisé soit simple. J'essaie de trouver une solution et la publierai ici si elle est trouvée.

10

Basé sur @ tux21b,

 var bounds = new google.maps.LatLngBounds(); 
     polyline.getPath().forEach(function(e){//can't do polyline.getPath()[i] because it's a MVCArray 
      bounds.extend(e); 
     })   
     _map.fitBounds(bounds);