我正在使用OpenLayers 3实现地图导出功能。
但是有一个问题:无法确定地图视图是否已完全加载或者是否缺少一些图块。
似乎没有这样的API或事件。最接近的是tileloadstart - tileloadend对。但OpenLayers异步加载切片,并且在切片实际加载之前,不会触发tileloadstart - 也就是说,在切片队列中排队的切片在实际加载之前不会触发该事件。
Hot我可以检测到地图视图已完全加载吗?
答案 0 :(得分:4)
我最终成功实现了导出功能。以下是粗略的解释。
tileloadstart
在tileloadend
上注册tileloaderror
,ol.source
,ol.source.on()
个事件处理程序,然后开始管理切片加载计数。postcompose
在ol.Map
上注册ol.Map.once()
个事件处理程序。ol.Map.renderSync()
。这会触发瓷砖加载,所以从现在起如果没有瓷砖加载,则意味着所有瓷砖都已加载。postcompose
事件处理程序上,使用event.context
从event.context.canvas.toDataURL()
捕获地图内容,并使用event.frameState.postRenderFunctions.push()
注册postrender功能(有点hacky)。tileload*
事件处理程序管理)。如果计数不为零,则放弃捕获的内容。此外,捕获已完成。tileloadend
和tileloaderror
上,如果图块加载计数为零,请从上面的步骤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
事件。