Verwenden Sie in OpenLayers 3 Layer-Loadstart- und Loadend-Ereignisse?

19

OpenLayers 2 hat diese Layer-Ereignisse "loadstart & loadend".

Was entspricht ihnen in OpenLayers 3?

Während eine Vektorebene geladen und gerendert wird, muss ein Ladesymbol angezeigt werden.

Mariam Malak
quelle
Welche Art von Vektorquelle verwenden Sie? Können Sie bitte etwas mehr Kontext angeben?
Erilem

Antworten:

19

Angenommen, Sie verwenden eine ol.layer.Vectormit einer, ol.source.GeoJSONdann können Sie so etwas verwenden:

var vectorSource = new ol.source.GeoJSON({
  projection : 'EPSG:3857',
  url: 'http://examples.org/fearures.json'
});

var vectorLayer = new ol.layer.Vector({
  source: vectorSource
});

map.addLayer(vectorLayer);

// show loading icon
// ...

var listenerKey = vectorSource.on('change', function(e) {
  if (vectorSource.getState() == 'ready') {
    // hide loading icon
    // ...
    // and unregister the "change" listener 
    ol.Observable.unByKey(listenerKey);
    // or vectorSource.unByKey(listenerKey) if
    // you don't use the current master branch
    // of ol3
  }
});

Hier sehen Sie, wie Sie eine Benachrichtigung erhalten, wenn die Vektorquelle geladen wird. Es funktioniert nur mit Quellen, von denen geerbt wird ol.source.StaticVector. Beispiele hierfür sind ol.source.GeoJSONund ol.source.KML.

Beachten Sie auch, dass dieser Code möglicherweise in Zukunft nicht mehr funktioniert, wenn ol3 eine konsistente Methode bietet, um festzustellen, ob / wann eine Quelle geladen wurde.

erilem
quelle
Groß! Ich habe auch danach gesucht. Fragen Sie sich, warum OL3 es noch nicht enthält.
Germán Carrillo
Warum nicht vectorSource.once('change', function(e){...}?
Jonatas Walker
14

In ol3 Version 3.10.0 haben sich die Dinge geändert. Ist also klarer als ältere Versionen aber immer noch komplizierter als ol2.

Für TILE-Ebenen (ol.layer.Tile) sollte Ihr Code-Ausschnitt also so aussehen:

//declare the layer
var osmLayer =  new ol.layer.Tile({
  source: new ol.source.OSM()
});
//asign the listeners on the source of tile layer
osmLayer.getSource().on('tileloadstart', function(event) {
//replace with your custom action
document.getElementById('tilesloaderindicatorimg').src = 'css/images/tree_loading.gif';
 });

osmLayer.getSource().on('tileloadend', function(event) {
//replace with your custom action
document.getElementById('tilesloaderindicatorimg').src = 'css/images/ok.png';
 });
osmLayer.getSource().on('tileloaderror', function(event) {
//replace with your custom action        
document.getElementById('tilesloaderindicatorimg').src = 'css/images/no.png';
 });

Während für WMS-Schichten der Ansatz etwas anders ist:

//declare the layer
var wmsLayer =   new ol.layer.Image({
source: new ol.source.ImageWMS({
  attributions: [new ol.Attribution({
    html: '© ' +
        '<a href="http://www.geo.admin.ch/internet/geoportal/' +
        'en/home.html">' +
        'National parks / geo.admin.ch</a>'
  })],
  crossOrigin: 'anonymous',
  params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
  serverType: 'mapserver',
  url: 'http://wms.geo.admin.ch/'
})
});

//and now asign the listeners on the source of it
var lyrSource = wmsLayer.getSource();
  lyrSource.on('imageloadstart', function(event) {
  console.log('imageloadstart event',event);
  //replace with your custom action
  var elemId = event.target.params_.ELEMENTID;
  document.getElementById(elemId).src = 'css/images/tree_loading.gif'; 
  });

  lyrSource.on('imageloadend', function(event) {
   console.log('imageloadend event',event);
  //replace with your custom action
  var elemId = event.target.params_.ELEMENTID;
  document.getElementById(elemId).src = 'css/images/ok.png'; 
  });

  lyrSource.on('imageloaderror', function(event) {
   console.log('imageloaderror event',event);
  //replace with your custom action
  var elemId = event.target.params_.ELEMENTID;
  document.getElementById(elemId).src = 'css/images/no.png'; 
  }); 

Bei WFS-Vektorebenen sind die Dinge noch komplizierter:

//declare the vector source
sourceVector = new ol.source.Vector({
    loader: function (extent) {
        //START LOADING
        //place here any actions on start loading layer
        document.getElementById('laodingcont').innerHTML = "<font color='orange'>start loading.....</font>";
        $.ajax('http://demo.opengeo.org/geoserver/wfs', {
            type: 'GET',
            data: {
                service: 'WFS',
                version: '1.1.0',
                request: 'GetFeature',
                typename: 'water_areas',
                srsname: 'EPSG:3857',
                bbox: extent.join(',') + ',EPSG:3857'
            }
        }).done(loadFeatures)
            .fail(function () {
            //FAIL LOADING
            //place here any actions on fail loading layer
            document.getElementById('laodingcont').innerHTML = "<font color='red'>error loading vector layer.</font>";
        });
    },
    strategy: ol.loadingstrategy.bbox
});

//once we have a success responce, we need to parse it and add fetaures on map
function loadFeatures(response) {
formatWFS = new ol.format.WFS(),
sourceVector.addFeatures(formatWFS.readFeatures(response));
 //FINISH LOADING
document.getElementById('laodingcont').innerHTML = "<font color='green'>finish loading vector layer.</font>";
}

Überprüfen Sie diesen Beitrag. Es hat alle oben genannten + eine Geige für die WFS-Vektorebenen

Pavlos
quelle
1
Willkommen bei GIS.SE! Können Sie bitte Ihre Antwort erweitern und einen kurzen Überblick über den Artikel geben, auf den Sie verlinkt haben, und welchen Teil Sie für die Beantwortung dieser Frage benötigen? Auf diese Weise kann die Antwort den Menschen auf dieser Site helfen, auch wenn der Link abbricht.
Kersten
Entschuldigung newby. getan!!!!!!!!
Pavlos
Um zu überprüfen,
Daniël Tulp
Dies sollte die beste Antwort sein!
Joaorodr84
1
Bitte OL Jungs .... KISS Mann ... KISS ....
Magno C
2

Ich habe die Klasse nicht gefunden ol.source.GeoJSONund konnte keinen Fall finden, in dem vectorSource.getState() != 'ready'. Also habe ich so etwas gemacht:

    function spin(active) {
        if (active) {
            // start spinning the spinner
        } else {
            // stop spinning the spinner
        }
    }

    // Toggle spinner on layer loading
    layer.on('change', function() {
        spin();
    });
    layer.getSource().on('change', function() {
        spin(false);
    });
Damien
quelle
Bitte posten Sie auch die Schleuderfunktion, es sieht so aus, als würden Sie sie gerade schleudern und das Schleudern nicht stoppen, wenn Sie mit dem Laden der Ebene fertig sind
Daniël Tulp,
1

Sie können auch die Funktion getState () verwenden

if (source instanceof ol.source.Vector) {
        source.on("change", function () {
            //console.log("Vector change, state: " + source.getState());
            switch (source.getState()) {
                case "loading":
                    $("#ajaxSpinnerImage").show();
                    break;
                default:
                    $("#ajaxSpinnerImage").hide();
            }
        });
    }
Daniël Tulp
quelle
Ich verwende ol-v4.2.0. source.getState()
Gibt
1

In OL 4.5.0 habe ich für Vektorebenen keine Möglichkeit gefunden, mit der Quelle umzugehen. Stattdessen verwende ich für die Ebenenereignisse Folgendes:

if (layer instanceof ol.layer.Vector) {
    layer.on("precompose", function () {
              $("#ajaxSpinnerImage").show();
            });
    layer.on("render", function () {
              $("#ajaxSpinnerImage").hide();
            });
}

Hoffe es kann helfen.

Jean Pierre Huart
quelle