2010-07-23 6 views
20

Ho una sovrapposizione generata dinamicamente dai dati utente, quindi ho bisogno di sapere come trovare il centro di tale overlay.API di Google Maps: Calcola centro/Zoom di polilinea

Attualmente, sto solo utilizzando le prime coordinate dall'overlay, ma in realtà non rappresenta il centro dell'overlay. Pertanto quando carico la mappa, non è centrata sull'overlay.

Qualcuno ha un buon metodo per centrare la mappa sull'overlay, calcolando il centro, non codificandolo con precisione?

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 
    }; 

risposta

78

Se si dispone di un elenco di coordinate, è possibile effettuare il ciclo su di loro e li aggiungono a un oggetto LatLngBounds. Ecco un esempio per l'API V3, ma il concetto in V2 è simile:

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

Dopo di che, si può ottenere il centro con:

bounds.getCenter(); 

Oppure, in alternativa, si può chiamare map.fitBounds() direttamente, che centrerà la mappa attorno al centro dei limiti e regolerà lo zoom, in modo che i limiti interi si adattino esattamente alla porta della vista.

map.fitBounds(bounds); 
+0

Si sono impressionanti! Grazie, questo ha funzionato proprio come avevo bisogno! –

+0

Potrebbe essere utilizzato questo stesso metodo per calcolare lo zoom? –

+0

Basta usare qualsiasi posizione e livello di zoom desiderato durante l'inizializzazione e chiamare 'map.fitBounds (bounds);' successivamente come descritto. Se si desidera applicare un livello massimo di zoom, sarà necessario registrare temporaneamente un 'zoomChangeBoundsListener'. Dimmi se hai bisogno di un esempio anche per quello. – tux21b

2

La funzione getCenter di LatLngBounds non fornisce sempre un punto ENTRO la polilinea. Sembra che l'algoritmo utilizzato sia semplice. Sto cercando di trovare una soluzione e la pubblicherò qui se ne trovo una.

10

Sulla base di @ 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);