OpenLayers 3에서 레이어로드 스타트 ​​및로드 엔드 이벤트를 사용하십니까?


19

OpenLayers 2에는 이러한 계층 이벤트 "loadstart & loadend"가 있습니다.

OpenLayers 3에서 이와 동등한 기능은 무엇입니까?

벡터 레이어가로드되고 렌더링되는 동안로드 아이콘을 표시해야합니다.


어떤 유형의 벡터 소스를 사용하십니까? 좀 더 컨텍스트를 제공해 주시겠습니까?
erilem

답변:


19

ol.layer.Vector와 함께 사용한다고 가정하면 ol.source.GeoJSON다음과 같이 사용할 수 있습니다.

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

벡터 소스가로드 될 때 알림을받는 방법을 보여줍니다. 에서 상속 된 소스에서만 작동합니다 ol.source.StaticVector. 예는 ol.source.GeoJSONand ol.source.KML입니다.

또한 ol3가 소스가로드되는지 여부를 알 수있는 일관된 방법을 제공 할 경우이 코드는 향후 더 이상 작동하지 않을 수 있습니다.


큰! 나도 이것을 찾고 있었다. OL3에 아직 포함되어 있지 않은 이유가 궁금합니다.
Germán Carrillo

왜 안돼 vectorSource.once('change', function(e){...}?
Jonatas Walker 2013

14

ol3 버전 3.10.0에서는 상황이 변경되었습니다. 따라서 이전 버전보다 더 명확하지만 ol2보다 여전히 더 복잡합니다.

따라서 TILE (ol.layer.Tile) 레이어의 경우 코드 조각은 다음과 같아야합니다.

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

WMS 계층의 경우 접근 방식이 약간 다릅니다.

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

WFS 벡터 레이어의 경우 상황이 훨씬 복잡합니다.

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

이 게시물을 확인하십시오. 그것은 위의 모든 + WFS 벡터 레이어에 대한 바이올린을 가지고 있습니다.


1
GIS.SE에 오신 것을 환영합니다! 답을 넓히고 링크 한 기사와이 질문에 대한 답과 관련된 부분을 간략하게 설명해 주시겠습니까? 이렇게하면 링크가 종료 된 후에도이 사이트의 사람들이 답변을 얻을 수 있습니다.
Kersten

죄송합니다. 끝난!!!!!!!!
pavlos

체크 된 레이어 당신이 가지고있는 유형으로, 여기 OL3을 위해 그것을 할 방법을 밴 gis.stackexchange.com/a/140852/63141
다니엘 TULP

이것이 최고의 답변이어야합니다!
joaorodr84

1
OL 얘들 아 .... 키스 남자 ... 키스 ....
Magno C

2

나는 수업을 ol.source.GeoJSON찾지 못했고 어디에서 사건을 찾을 수 없었다 vectorSource.getState() != 'ready'. 그래서 나는 다음과 같은 일을 끝내 었습니다.

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

또한 스핀 기능을 게시하시기 바랍니다, 당신이 그냥 회전 마무리 로딩에 레이어 회전을 정지하지 않는 것 같습니다
다니엘 TULP

1

getState () 함수 를 사용할 수도 있습니다

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

ol-v4.2.0을 사용하고 있습니다. source.getState()항상 '준비'를 반환
himyata

1

OL 4.5.0에서 벡터 레이어의 경우 소스를 처리하는 방법을 찾지 못했습니다. 대신 레이어 이벤트에서 다음을 사용합니다.

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

그것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.