2012-04-20 6 views
17

Ho una mappa leaflet.js che contiene punti e linee che provengono da un file JSON esterno.Leaflet.js - Adatta le coordinate geoJSON sulla vista mappa

Se aggiungo: map.setView (new L.LatLng (0,0), 10);

Centra la mappa sulla latitudine e longitudine 0,0. Come posso impostarlo in modo che il centro della mappa e lo zoom si adattino tutti i punti del JSON su di esso?

risposta

20

È possibile aggiungere tutti i livelli a un FeatureGroup che dispone di un metodo getBounds. Quindi dovresti poter dire solo myMap.fitBounds(myFeatureGroup.getBounds());

Il metodo getBounds per L.FeatureGroup è disponibile solo nel ramo principale (non nella versione più recente, 0.3.1), almeno per ora.

+0

Ok, grazie per l'aiuto. Quindi se al momento il mio codice che aggiunge il layer geoJSON è simile a: geojsonLayer.addGeoJSON (jsonData); map.addLayer (geojsonLayer); map.fitBounds (jsonGroup.getBounds()); Lo cambierei in: geojsonLayer.addGeoJSON (jsonData); map.addLayer (geojsonLayer); var jsonGroup = new L.FeatureGroup (jsonData); map.fitBounds (jsonGroup.getBounds()); E che dovrebbe funzionare? – James

+0

Spiacente, ho eliminato tutta la formattazione del mio post in alto e non sono sicuro di come conservarlo quando salvi il commento. – James

+0

È piuttosto difficile eseguire il debug nei commenti. Puoi incollare il tuo codice su http://jsfiddle.net per mostrarmi cosa hai (o almeno in parte)? – Jason

1

Avevo bisogno di fare questo quando mostra un utente direzioni dalla sua origine a una destinazione. Devo conservare la mia lista di direzioni in una matrice di L.LatLng chiamato directionLatLngs allora si può semplicemente chiamare

map.fitBounds(directionLatLngs); 

Questo funziona perché map.fitBounds prende un oggetto L.LatLngBounds che è solo una serie di L.LatLng

http://leafletjs.com/reference.html#latlngbounds

5

Simile caso con me. Ho disegnato tutti i marcatori da dati GeoJson. Così ho scritto la funzione, che viene chiamata ripetutamente al clic del pulsante. Prova solo se soddisfa le tue esigenze.

function bestFitZoom() 
    { 
     // declaring the group variable 
     var group = new L.featureGroup; 

     // map._layers gives all the layers of the map including main container 
     // so looping in all those layers filtering those having feature 
     $.each(map._layers, function(ml){ 

      // here we can be more specific to feature for point, line etc.    
      if(map._layers[].feature) 
      { 
       group.addLayer(this) 
      } 
     }) 

     map.fitBounds(group.getBounds()); 
    } 

Il miglior uso della scrittura di questa funzione è che anche lo stato di carta/marcatori cambiato, otterrà più recente stato/corrente di marcatori/strati. Ogni volta che questo metodo viene chiamato, tutti i livelli saranno visibili a un livello di zoom modesto.