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

zeo*_*dtr 7 openlayers-3

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

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

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

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

Bar*_*oży 5

postrender事件似乎可以解决问题,如下所示:

map.once('postrender', function(event) {
    doyourmagic();
});
Run Code Online (Sandbox Code Playgroud)

至少可以从OpenLayers 3.8.2运行。有精细的回答关于主题。


zeo*_*dtr 5

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

  1. 在s 上使用注册tileloadstarttileloadendtileloaderror事件处理程序,并开始管理 tile 加载计数。ol.sourceol.source.on()
  2. postcomposeol.Mapusing上注册事件处理程序ol.Map.once()
  3. 打电话ol.Map.renderSync()。这会触发瓦片加载,因此从现在开始如果没有瓦片加载,则意味着所有瓦片都已加载。
  4. postcompose事件处理程序上,event.context使用 using捕获地图内容event.context.canvas.toDataURL(),并使用event.frameState.postRenderFunctions.push()(有点hacky)注册后渲染函数。
  5. 在注册的后渲染函数上,检查图块加载计数(可由tileload*事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获完成。
  6. tileloadend和 上tileloaderror,如果图块加载计数变为零,则从上面的步骤 3 重试。

  • 我赞同上述评论。代码示例会很棒。 (2认同)