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

时间:2015-12-16 11:58:38

标签: openlayers-3

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

postrender 事件似乎可以解决这个问题:

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

至少从OpenLayers 3.8.2起作用。关于这个主题有很好的答案there

答案 2 :(得分:1)

基本上为了确保在地图上呈现所有内容,您需要为地图上的每个图层监听loadend事件。对于wms和wfs层,这很清楚,我猜你知道怎么做。 对于切片图层,请查看此示例here

答案 3 :(得分:1)

Meanwhile,OpenLayers提供了一个方便的much sought after rendercomplete事件。