Openlayers 3 OpenLayers:如何检测地图视图是否已完全加载?

Openlayers 3 OpenLayers:如何检测地图视图是否已完全加载?,openlayers-3,Openlayers 3,我正在使用OpenLayers 3实现地图导出功能 但有一个问题:我们无法确定地图视图是否已完全加载,或者是否缺少一些分幅 似乎没有这样的API或事件。最接近的是tileloadstart-tileloadend对。但是OpenLayers异步加载磁贴,并且在磁贴实际加载之前,不会触发tileloadstart—也就是说,在磁贴队列中排队的磁贴在实际加载之前不会触发事件 Hot我可以检测地图视图是否已完全加载吗?基本上,为了确保地图上的所有内容都已渲染,您需要侦听地图上每个图层的loadend事

我正在使用OpenLayers 3实现地图导出功能

但有一个问题:我们无法确定地图视图是否已完全加载,或者是否缺少一些分幅

似乎没有这样的API或事件。最接近的是tileloadstart-tileloadend对。但是OpenLayers异步加载磁贴,并且在磁贴实际加载之前,不会触发tileloadstart—也就是说,在磁贴队列中排队的磁贴在实际加载之前不会触发事件


Hot我可以检测地图视图是否已完全加载吗?

基本上,为了确保地图上的所有内容都已渲染,您需要侦听地图上每个图层的loadend事件。对于wms和wfs层,这是很清楚的,我想你知道怎么做。
对于平铺层,请检查此示例

postrender事件似乎可以实现此功能,如下所示:

map.once('postrender', function(event) {
    doyourmagic();
});

至少在OpenLayers 3.8.2中可用。关于这个问题有很好的答案。

我最终成功地实现了导出功能。下面是粗略的解释

  • 使用
    ol.source.on()
    ol.source
    上注册
    tileloadstart
    tileloaderror
    事件处理程序,并开始管理磁贴加载计数
  • 使用
    ol.Map.once()
    ol.Map
    上注册
    postcompose
    事件处理程序
  • 调用
    ol.Map.renderSync()
    。这将触发磁贴加载,因此从现在起,如果没有磁贴加载,则意味着所有磁贴都已加载
  • postcompose
    事件处理程序上,使用
    event.context.canvas.toDataURL()
    event.context
    捕获映射内容,并使用
    event.frameState.postRenderFunctions.push()
    (有点不太正常)
  • 在注册的postrender函数上,检查平铺加载计数(可由
    tileload*
    事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获就完成了
  • tileloadend
    tileloaderror
    上,如果磁贴加载计数变为零,请从上面的步骤3重试

  • ,OpenLayers提供了一个
    rendercomplete
    事件,该事件可能很方便。

    tileload*事件不适用于此问题。由于tile队列管理器异步地对tile进行队列加载,因此,如果没有加载tile,则不一定意味着加载了所有tile。代码示例非常好。请记住,每次贴图移动时都会触发该示例。如果像此示例一样使用
    一次
    ,则只会触发一次,而
    map.on('postrender')…
    将在贴图移动时触发,直到使用
    un