Sử dụng lớp loadstart & loadend event trong OpenLayers 3?


19

OpenLayers 2 có các sự kiện lớp này "loadstart & loadend."

Điều gì tương đương với họ trong OpenLayers 3?

Trong khi một lớp vectơ tải và được hiển thị, tôi cần hiển thị biểu tượng tải.


Bạn sử dụng loại nguồn vector nào? Bạn có thể vui lòng cung cấp thêm một chút bối cảnh?
erilem

Câu trả lời:


19

Giả sử bạn sử dụng một ol.layer.Vectorvới một ol.source.GeoJSONbạn có thể sử dụng một cái gì đó như thế này:

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

Điều này cho thấy làm thế nào để có được một thông báo khi nguồn vector được tải. Nó chỉ hoạt động với các nguồn kế thừa từ ol.source.StaticVector. Ví dụ bao gồm ol.source.GeoJSONol.source.KML.

Ngoài ra, lưu ý rằng mã này có thể không còn hoạt động trong tương lai khi ol3 sẽ cung cấp một cách nhất quán để biết nếu / khi một nguồn được tải.


Tuyệt quá! Tôi đã tìm kiếm điều này quá. Tự hỏi tại sao OL3 chưa bao gồm nó.
Germán Carrillo

Tại sao không vectorSource.once('change', function(e){...}?
Jonatas Walker

14

Trong phiên bản ol3 3.10.0 mọi thứ đã thay đổi. Như vậy là rõ ràng hơn các phiên bản cũ nhưng vẫn phức tạp hơn ol2.

Vì vậy, đối với các lớp TILE (ol.layer.Tile), mã snip của bạn sẽ trông như sau:

//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';
 });

trong khi đối với các lớp WMS thì cách tiếp cận hơi khác một chút:

//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'; 
  }); 

Đối với các lớp Vector WFS, mọi thứ thậm chí còn phức tạp hơn:

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

kiểm tra bài này nó có tất cả những điều trên + một câu đố cho các lớp vectơ WFS


1
Chào mừng bạn đến với GIS.SE! Bạn có thể vui lòng mở rộng câu trả lời của bạn và cung cấp một bản tóm tắt ngắn của bài viết bạn liên kết đến và phần nào có liên quan đến câu trả lời của câu hỏi này. Bằng cách này, câu trả lời sẽ có thể giúp mọi người trên trang web này, ngay cả sau khi liên kết chết.
Kersten

xin lỗi người mới làm xong!!!!!!!!
pavlos

để kiểm tra loại lớp bạn có, đây là cách bạn van làm điều đó cho OL3 gis.stackexchange.com/a/140852/63141
Daniël Tulp

Đây phải là câu trả lời hàng đầu!
joaorodr84

1
Xin các bạn CV .... KISS man ... KISS ....
Magno C

2

Tôi đã không tìm thấy lớp học ol.source.GeoJSON, và không thể tìm thấy một trường hợp vectorSource.getState() != 'ready'. Vì vậy, tôi đã kết thúc việc làm như thế này:

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

xin vui lòng gửi chức năng quay, có vẻ như bạn chỉ đang quay chúng và không dừng quay khi hoàn tất tải lớp
Daniël Tulp

1

bạn cũng có thể sử dụng getState () chức năng

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

Tôi đang sử dụng ol-v4.2.0. source.getState()luôn luôn trả về 'sẵn sàng'
himyata

1

Trên OL 4.5.0, đối với các lớp vectơ tôi chưa tìm được cách xử lý nguồn, thay vào đó tôi sử dụng các cách sau trên các sự kiện của lớp:

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

Hy vọng nó có thể giúp đỡ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.