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

OpenLayers: How to detect the map view is completely loaded?

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

但有一个问题:无法确定地图视图是否已完全加载或缺少一些图块。

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

我能否检测到地图视图已完全加载?

基本上,为了确保地图上的所有内容都已呈现,您需要监听地图上每个图层的加载结束事件。对于 wms 和 wfs 层,这很清楚,我猜你知道如何去做。 对于图块图层,请查看此示例 here

postrender 事件似乎可以解决问题,像这样:

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

至少适用于 OpenLayers 3.8.2。关于这个主题有很好的答案

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

  1. 使用 ol.source.on()ol.source 上注册 tileloadstarttileloadendtileloaderror 事件处理程序,并开始管理磁贴加载计数。
  2. 使用 ol.Map.once()ol.Map 上注册 postcompose 事件处理程序。
  3. 呼叫ol.Map.renderSync()。这会触发图块加载,所以从现在开始如果没有图块加载,则意味着所有图块都已加载。
  4. postcompose 事件处理程序上,使用 event.context.canvas.toDataURL()event.context 捕获地图内容,并使用 event.frameState.postRenderFunctions.push() 注册 postrender 函数(有点 hacky)。
  5. 在已注册的 postrender 函数上,检查图块加载计数(可由 tileload* 事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获完成。
  6. tileloadendtileloaderror 上,如果磁贴加载计数变为零,请从上面的步骤 3 重试。

Meanwhile, OpenLayers provides a much sought after rendercomplete 可能会派上用场的活动。