2015-05-08 10 views
6

Ich benutze openlayers 3, um eine Karte mit Vektorfunktionen oben zu erstellen. So weit, ist es gut.openlayers 3 Zoom auf kombiniertes Ausmaß

Ich habe mehrere Vektorebenen, gruppiert in einer Variablen namens projecten.

var projecten = new ol.layer.Group({ 

      title: 'Projecten', 
      layers: [ 

       new ol.layer.Vector({ 
       title: 'EVZ Den Dungen', 
       source: new ol.source.GeoJSON(
          /** @type {olx.source.GeoJSONOptions} */ ({ 
           object: EVZDenDungen, 
           projection: 'EPSG:3857' 
         })), 
       style: function(feature, resolution) { 
        return lookup[feature.get('landschapselement')]; 
       } 
       }), 

       new ol.layer.Vector({ 
       title: 'EVZ Croy', 
       source: new ol.source.GeoJSON(
          /** @type {olx.source.GeoJSONOptions} */ ({ 
           object: EVZCroy, 
           projection: 'EPSG:3857' 
         })), 
       style: function(feature, resolution) { 
        return lookup[feature.get('landschapselement')]; 
       } 
       }), 

       new ol.layer.Vector({ 
       title: 'Natuurcompensatie Gasselsbroek', 
       source: new ol.source.GeoJSON(
          /** @type {olx.source.GeoJSONOptions} */ ({ 
           object: NatuurcompensatieGasselsbroek, 
           projection: 'EPSG:3857' 
         })), 
       style: function(feature, resolution) { 
        return lookup[feature.get('landschapselement')]; 
       } 
       }), 

       new ol.layer.Vector({ 
       title: 'Ebben', 
       source: new ol.source.GeoJSON(
          /** @type {olx.source.GeoJSONOptions} */ ({ 
           object: Ebben, 
           projection: 'EPSG:3857' 
         })), 
       style: function(feature, resolution) { 
        return lookup[feature.get('landschapselement')]; 
       } 
       }), 

       new ol.layer.Vector({ 
       title: 'Zionsburg', 
       source: new ol.source.GeoJSON(
          /** @type {olx.source.GeoJSONOptions} */ ({ 
           object: Zionsburg, 
           projection: 'EPSG:3857' 
         })), 
       style: function(feature, resolution) { 
        return lookup[feature.get('landschapselement')]; 
       } 
       }) 


      ] 
}) 

Jetzt möchte ich die projecten Variablen irgendwie Schleife durch, Schleife durch die Schichten nacheinander, um das Ausmaß der jeweiligen Feature-Layer erhalten und stoppen, wenn die letzte Schicht erreicht ist. Dann möchte ich auf diesen kombinierten Umfang zoomen.

Das ist meine Grundeinstellung (Ich bin nicht gut mit Javascript und Schleifen):

projecten.getLayers() 
    for (var i = 0, ii = layers.length; i < ii; ++i) { 
     layer = layers[i]; 
     ol.extent.boundingExtend(extent, layer.getBounds()); 
    } 
    map.getView().fitExtent(extent,map.getSize()); 

Alle Ideen, wie ich dies nicht erhalten zu arbeiten?

+0

Ich weiß nicht, Extends gut genug, um eine Antwort zu erstellen, aber ich denke, in Ihrer Schleife können Sie ol.extent.getBottomLeft und ol.extent.getTopRight für die Ebene Ebene verwenden. Speichern Sie die Mindestwerte von links unten und die Höchstwerte von oben rechts und verwenden Sie diese, um Ihre neue Ausdehnung zu erstellen. –

+0

Wie? Kannst du es versuchen? – user1697335

Antwort

15

sollten Sie in der Lage sein, dies zu tun:

var extent = ol.extent.createEmpty(); 
projecten.getLayers().forEach(function(layer) { 
    ol.extent.extend(extent, layer.getSource().getExtent()); 
}); 
map.getView().fitExtent(extent, map.getSize()); 

die ol.extent.createEmpty() Funktion können Sie Ihre Maße initialisieren. Durchlaufen Sie dann die Auflistung der Ebenen und verwenden Sie ol.extent.extend(), um einen Bereich zu erstellen, der alle Features in allen Vektorquellen enthält. Passen Sie schließlich die Kartenansicht in diesem Ausmaß an.

Hier sind einige Dinge zu beachten. Die Methode group.getLayers() gibt ol.Collection Layer zurück. Dies ist vergleichbar mit einem normalen JavaScript Array, außer dass es beobachtbar ist. Sie können die Methode collection.forEach() verwenden, um jeden Layer in der Auflistung zu durchlaufen.

Beachten Sie auch, dass Sie source.getExtent() aufrufen sollten, um den Umfang aller derzeit geladenen Features in einer Quelle zu erhalten.

Schließlich sind die obigen Links für die Version 3.5.0 und höher relevant. Sie müssen Ihren Code anpassen, um mit ol.source.Vector Objekten anstelle der experimentellen (und jetzt entfernten) ol.source.GeoJSON Objekte zu arbeiten. Einzelheiten zum Upgrade auf die neue Vektor-API finden Sie unter 3.5.0 release notes.

+0

Super Tim! Danke vielmals! – user1697335

+0

irgendwie kann ich Objekt in den neuen ol.source.vector nicht laden? – user1697335

+0

'neuer ol.layer.Vector ({ Titel: 'Natuurcompensatie Gasselsbroek', Quelle: neuer ol.source.Vector ({ \t \t \t \t \t \t \t url: NatuurcompensatieGasselsbroek, \t \t \t \t \t \t \t Format : neuer ol.format.GeoJSON() \t \t \t \t \t}), \t \t \t \t \t Stil: function (Funktion, Auflösung) { \t \t \t \t \t \t Rückkehr Lookup [Feature.get (landschaftselement)]; \t \t \t \t \t} \t \t \t \t \t}) ' – user1697335