【发布时间】:2015-10-11 03:25:32
【问题描述】:
我们有一些使用ol.source.XYZ 源的层。对于加载策略,我们使用ol.loadingstrategy.tile(new ol.tilegrid.createXYZ({}))。在进行其他操作之前,我们需要确保所有瓦片都已完全加载到地图视图中。
我们遇到了多篇关于此的文章,但尚未找到一个 100% 的解决方案来为我们提供所需的解决方案。即使不是这种情况,逻辑也会返回 true。我们尝试使用example 页面上显示的 tileloadstart、tileloadend、tileloaderror 事件,但这似乎并不总是返回预期的结果。
GIS Stack Exchange 文章 here 看起来很有希望,因为我们可以将下面列出的代码与 tileloadstart/tileloadend 事件结合使用,但是有许多函数调用仅在 ol-debug.js 中可用 而不是 ol.js 源代码。因此,下面粘贴的代码不适用于 ol.js。此代码只是引用的 GIS Stack Exchange 文章的副本。
function calculateNumberOfTiles(tileSource) {
var tg = (tileSource.getTileGrid()) ? tileSource.getTileGrid(): ol.tilegrid.getForProjection(map.getView().getProjection()),
z = tg.getZForResolution(map.getView().getResolution()),
tileRange = tg.getTileRangeForExtentAndZ(map.getView().calculateExtent(map.getSize()), z),
xTiles = tileRange['maxX'] - tileRange['minX'] + 1,
yTiles = tileRange['maxY'] - tileRange['minY'] + 1;
return xTiles * yTiles;
}
我有两个问题,任何人都可以就我们可能遗漏的内容提供任何其他想法吗?谢谢你的帮助。
- 当函数调用挂在tilegrid 对象的原型时,为什么在 ol-debug.js 而不是 ol.js 中可用的函数调用?
- 任何其他建议如何告诉地图中的所有图块都已完全加载?
【问题讨论】:
-
您能否描述一下结果与您的预期有何不同?您是否试图推断是否已加载给定 tilegrid 中的所有图块,或者是否仍在进行任何加载?另外,你用的是什么版本?
-
尝试确定当前地图范围和缩放是否还有任何需要加载的内容。我们需要确保没有待加载的图块。基于我们在 SO question 中找到的另一个示例,我们认为我们可以在 tileloadstart 事件中保留一个计数器,并在每次触发时递增计数器,并在每次触发 tileloadend 或 tileloaderror 时递减计数器。当计数器变为 0 时假设完成。在某些情况下,我们的计数器从未达到 0,这就是它与预期不同的地方。它似乎在批量做一些事情。
-
我们最近刚刚更新到 OL 的 v3.9,就在 3.10 可用之前
-
所以您的问题是某些图块似乎开始加载但似乎没有完成(根据源的事件)?您是否确定了那些(未完成的)瓷砖会发生什么?他们还在加载还是完成了?
-
有点,tileloadend 事件确实会触发,就像它表明它已完成但在地图中瓷砖还没有出现。我们的计数器降为 0,因为即使磁贴尚未完全加载,事件也已触发。最终,瓷砖出现在地图中,但 tileloadend 事件似乎触发得太早了,可能吗?
标签: openlayers-3 tiles