2015-09-15 22 views
5

Ho questo file GeoJSON (polygon.geojson) ...Come ottenere l'estensione di un vettore vettoriale GeoJSON?

{ 
    "type": "Feature", 
    "geometry": { "type": "Polygon", "coordinates": [ [ [73, 15], [83.0, 15], [83, 5], [73, 5], [73, 15] ] ] }, 
    "properties": { "name": "Foo" } 
} 

... e usarlo come fonte di vettore:

var vectorSource = new ol.source.Vector({ 
    url: 'polygon.geojson', 
    format: new ol.format.GeoJSON(), 
    projection : 'EPSG:4326', 
}); 

Ora voglio ottenere nella misura di:

var extent = vectorSource.getExtent(); 

Il valore di extent, tuttavia, è:

Array [ Infinity, Infinity, -Infinity, -Infinity ] 

Sto usando OL 3.9.0 e il livello vettoriale con questa sorgente è visualizzato correttamente. Che cosa sto facendo di sbagliato?

+0

Si potrebbe provare a sostituire 'ol.js' da' ol-debug.js' e passo nel metodo getExtent per vedere realmente cosa sta succedendo (utilizzando il browser Dev Tool). Forse potrebbe essere d'aiuto. –

+0

Sicuro di non usare 'useSpatialIndex' o di chiamare il metodo prima che la sorgente vettoriale abbia caricato qualche funzione? –

+0

Forse i dati non sono ancora stati caricati quando voglio calcolare l'estensione (ho notato che l'estensione è impostata quando apro la console Web dopo che la pagina è stata caricata). Come posso verificare se i dati sono pronti? – Mark

risposta

5

ho capito. Ho bisogno di aspettare fino a quando la sorgente viene caricato:

vectorSource.once('change',function(e){ 
    if(vectorSource.getState() === 'ready') { 
     var extent = vectorSource.getExtent(); 
     console.log(extent); 
     map.getView().fit(extent, map.getSize()); 
    } 
}); 

EDIT: Potrebbe essere più sicuro per ingrandire solo se il livello non è vuoto:

vectorSource.once('change',function(e){ 
    if(vectorSource.getState() === 'ready') { 
     if(layers[0].getSource().getFeatures().length>0) { 
      map.getView().fit(vectorSource.getExtent(), map.getSize()); 
     } 
    } 
}); 
+0

Anche il lavoro su 3.15.1 è confermato. –

1

Se stai cercando di fit nella misura provare questo:

var extent = *YOURLAYER*.getSource().getExtent(); 
map.getView().fit(extent, map.getSize()); 
+0

Sì, questo è quello che cerco di raggiungere. Tuttavia, ottengo 'TypeError: Argument 2 di CanvasRenderingContext2D.putImageData non è un valore a virgola mobile finito. – Mark

1

Si potrebbe ad anello per ogni caratteristica e creare calcolare limiti come questo:

var bounds = ol.extent.createEmpty(); 
for(var i=0;i< features.length;i++){ 
ol.extent.extend(bounds,features[i].getGeometry().getExtent()) 
} 

map.getView().fitExtend(bounds , map.getSize());