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。关于这个主题有很好的答案。
我最终成功实现了导出功能。下面是粗略的解释。
- 使用
ol.source.on()
在 ol.source
上注册 tileloadstart
、tileloadend
、tileloaderror
事件处理程序,并开始管理磁贴加载计数。
- 使用
ol.Map.once()
在 ol.Map
上注册 postcompose
事件处理程序。
- 呼叫
ol.Map.renderSync()
。这会触发图块加载,所以从现在开始如果没有图块加载,则意味着所有图块都已加载。
- 在
postcompose
事件处理程序上,使用 event.context.canvas.toDataURL()
从 event.context
捕获地图内容,并使用 event.frameState.postRenderFunctions.push()
注册 postrender 函数(有点 hacky)。
- 在已注册的 postrender 函数上,检查图块加载计数(可由
tileload*
事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获完成。
- 在
tileloadend
和 tileloaderror
上,如果磁贴加载计数变为零,请从上面的步骤 3 重试。
Meanwhile, OpenLayers provides a much sought after rendercomplete
可能会派上用场的活动。
我正在使用 OpenLayers 3 实现地图导出功能。
但有一个问题:无法确定地图视图是否已完全加载或缺少一些图块。
似乎没有这样的API或事件。最接近的是 tileloadstart - tileloadend 对。但是 OpenLayers 异步加载图块,并且在图块实际加载之前不会触发 tileloadstart - 也就是说,在图块队列中排队的图块在实际加载之前不会触发事件。
我能否检测到地图视图已完全加载?
基本上,为了确保地图上的所有内容都已呈现,您需要监听地图上每个图层的加载结束事件。对于 wms 和 wfs 层,这很清楚,我猜你知道如何去做。 对于图块图层,请查看此示例 here
postrender 事件似乎可以解决问题,像这样:
map.once('postrender', function(event) {
doyourmagic();
});
至少适用于 OpenLayers 3.8.2。关于这个主题有很好的答案
我最终成功实现了导出功能。下面是粗略的解释。
- 使用
ol.source.on()
在ol.source
上注册tileloadstart
、tileloadend
、tileloaderror
事件处理程序,并开始管理磁贴加载计数。 - 使用
ol.Map.once()
在ol.Map
上注册postcompose
事件处理程序。 - 呼叫
ol.Map.renderSync()
。这会触发图块加载,所以从现在开始如果没有图块加载,则意味着所有图块都已加载。 - 在
postcompose
事件处理程序上,使用event.context.canvas.toDataURL()
从event.context
捕获地图内容,并使用event.frameState.postRenderFunctions.push()
注册 postrender 函数(有点 hacky)。 - 在已注册的 postrender 函数上,检查图块加载计数(可由
tileload*
事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获完成。 - 在
tileloadend
和tileloaderror
上,如果磁贴加载计数变为零,请从上面的步骤 3 重试。
Meanwhile, OpenLayers provides a much sought after rendercomplete
可能会派上用场的活动。