2014-10-13 2 views
4

Как я могу поймать событие, загруженное с помощью плиток в OpenLayers 3? В OpenLayers 2 это может быть сделано путем поймать «loadend» событие из термобелье карты:OpenLayers 3 поймать плитки загруженного события

map.baseLayer.events.register('loadend' , false, function(){ }); 
+1

Это очень хороший вопрос. Я просто потратил некоторое время на grepping исходный код, и метод opt_tileCallback в renderer/layerrenderer.js, но я не вижу, как приложить к нему в первую очередь, и у меня нет времени для дальнейшего изучения. –

+0

Тот же вопрос. Кто-нибудь это знает? – Troy

+0

Обновление статуса от разработчиков ol: https://github.com/openlayers/ol3/issues/2832 –

ответ

1

Вы можете подключить это в следующем, как сейчас, пока что-то добавляется в ядро.

tileSource.setTileLoadFunction((function(){ 
     var numLoadingTiles = 0; 
     var tileLoadFn = tileSource.getTileLoadFunction(); 
     return (tile, src) => { 
      console.log(src); 
      if (numLoadingTiles === 0) { 
       console.log('loading'); 
      } 
      ++numLoadingTiles; 
      var image = tile.getImage(); 

      image.onload = image.onerror = function(){ 
       --numLoadingTiles; 
       if (numLoadingTiles === 0) { 
        console.log('idle'); 
       } 
      }; 
      tileLoadFn(tile, src); 
     }; 
    })()); 

Вы можете увидеть все классы исходных плитки, что это может быть использовано для здесь: http://openlayers.org/en/v3.4.0/apidoc/ol.source.TileImage.html?unstable=true#setTileLoadFunction

2

tileloadstart, tileloadend и tileloaderror события могут быть подписаны на источники плитки, начиная с OpenLayers v3.3.

Вы можете использовать что-то похожее на следующее:

var tilesLoading = 0, 
    tilesLoaded = 0; 

tileLayer.getSource().on('tileloadend', function() { 
    tilesLoaded++; 
    if (tilesLoading === tilesLoaded) { 
     console.log(tilesLoaded + ' tiles finished loading'); 
     tilesLoading = 0; 
     tilesLoaded = 0; 
     //trigger another event, do something etc... 
    } 
}); 

tileLayer.getSource().on('tileloadstart', function() { 
    this.tilesLoading++; 
});