【问题标题】:OpenLayers: How to detect the map view is completely loaded?OpenLayers:如何检测地图视图是否完全加载?
【发布时间】:2015-12-16 11:58:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: openlayers-3


    【解决方案1】:

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

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

    至少从 OpenLayers 3.8.2 开始工作。关于这个主题,there 有很好的答案。

    【讨论】:

    • 请记住,每次地图移动时也会触发此操作。
    • 如果你像这个例子一样使用once,它只会被触发一次,而map.on('postrender'...会在每次地图移动时触发,直到它被un起飞
    【解决方案2】:

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

    1. 使用ol.source.on()ol.sources 上注册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 函数上,检查 tile 加载计数(可以由 tileload* 事件处理程序管理)。如果计数不为零,则放弃捕获的内容。否则,捕获完成。
    6. tileloadendtileloaderror 上,如果图块加载计数变为零,请从上述步骤 3 重试。

    【讨论】:

    • 我赞同上述评论。一个代码示例会很棒。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      基本上,为了确保所有内容都在地图上呈现,您需要为地图上的每个图层监听 loadend 事件。对于 wms 和 wfs 层,这很清楚,我想您知道该怎么做。 对于瓦片层,检查这个例子here

      【讨论】:

      • tileload* 事件不适用于此问题。由于瓦片队列管理器异步将瓦片排队以进行加载,因此如果没有瓦片加载,则不一定意味着所有瓦片都已加载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多