diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index e6ce046ab9..14ada48772 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -309,7 +309,8 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = /** @type {Array.} */ var tilesToClear = []; - var findLoadedTiles = this.createLoadedTileFinder(tileSource, tilesToDrawByZ); + var findLoadedTiles = this.createLoadedTileFinder( + tileSource, projection, tilesToDrawByZ); var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index eb93e39538..d9a66b5f7e 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -121,7 +121,8 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame = var tilesToDrawByZ = {}; tilesToDrawByZ[z] = {}; - var findLoadedTiles = this.createLoadedTileFinder(tileSource, tilesToDrawByZ); + var findLoadedTiles = this.createLoadedTileFinder( + tileSource, projection, tilesToDrawByZ); var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index f6dd738106..5dd3da9a29 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -87,6 +87,7 @@ ol.renderer.Layer.prototype.hasFeatureAtCoordinate = goog.functions.FALSE; /** * Create a function that adds loaded tiles to the tile lookup. * @param {ol.source.Tile} source Tile source. + * @param {ol.proj.Projection} projection Projection of the tiles. * @param {Object.>} tiles Lookup of loaded * tiles by zoom level. * @return {function(number, ol.TileRange):boolean} A function that can be @@ -94,7 +95,8 @@ ol.renderer.Layer.prototype.hasFeatureAtCoordinate = goog.functions.FALSE; * lookup. * @protected */ -ol.renderer.Layer.prototype.createLoadedTileFinder = function(source, tiles) { +ol.renderer.Layer.prototype.createLoadedTileFinder = + function(source, projection, tiles) { return ( /** * @param {number} zoom Zoom level. @@ -102,12 +104,13 @@ ol.renderer.Layer.prototype.createLoadedTileFinder = function(source, tiles) { * @return {boolean} The tile range is fully loaded. */ function(zoom, tileRange) { - return source.forEachLoadedTile(zoom, tileRange, function(tile) { - if (!tiles[zoom]) { - tiles[zoom] = {}; - } - tiles[zoom][tile.tileCoord.toString()] = tile; - }); + return source.forEachLoadedTile(projection, zoom, + tileRange, function(tile) { + if (!tiles[zoom]) { + tiles[zoom] = {}; + } + tiles[zoom][tile.tileCoord.toString()] = tile; + }); }); }; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 6752062548..675aac21ae 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -105,6 +105,7 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { /** * Create a function that adds loaded tiles to the tile lookup. * @param {ol.source.Tile} source Tile source. + * @param {ol.proj.Projection} projection Projection of the tiles. * @param {Object.>} tiles Lookup of loaded * tiles by zoom level. * @return {function(number, ol.TileRange):boolean} A function that can be @@ -113,7 +114,7 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { * @protected */ ol.renderer.webgl.TileLayer.prototype.createLoadedTileFinder = - function(source, tiles) { + function(source, projection, tiles) { var mapRenderer = this.mapRenderer; return ( @@ -123,16 +124,17 @@ ol.renderer.webgl.TileLayer.prototype.createLoadedTileFinder = * @return {boolean} The tile range is fully loaded. */ function(zoom, tileRange) { - return source.forEachLoadedTile(zoom, tileRange, function(tile) { - var loaded = mapRenderer.isTileTextureLoaded(tile); - if (loaded) { - if (!tiles[zoom]) { - tiles[zoom] = {}; - } - tiles[zoom][tile.tileCoord.toString()] = tile; - } - return loaded; - }); + return source.forEachLoadedTile(projection, zoom, + tileRange, function(tile) { + var loaded = mapRenderer.isTileTextureLoaded(tile); + if (loaded) { + if (!tiles[zoom]) { + tiles[zoom] = {}; + } + tiles[zoom][tile.tileCoord.toString()] = tile; + } + return loaded; + }); }); }; @@ -239,7 +241,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame = tilesToDrawByZ[z] = {}; var findLoadedTiles = this.createLoadedTileFinder( - tileSource, tilesToDrawByZ); + tileSource, projection, tilesToDrawByZ); var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); var allTilesLoaded = true; diff --git a/src/ol/source/tileimagesource.js b/src/ol/source/tileimagesource.js index 78c66b99c4..697d1c0afb 100644 --- a/src/ol/source/tileimagesource.js +++ b/src/ol/source/tileimagesource.js @@ -115,9 +115,7 @@ ol.source.TileImage.prototype.getTileGridForProjection = function(projection) { /** - * @param {ol.proj.Projection} projection Projection. - * @return {ol.TileCache} Tile cache. - * @protected + * @inheritDoc */ ol.source.TileImage.prototype.getTileCacheForProjection = function(projection) { if (ol.proj.equivalent(this.getProjection(), projection)) { diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js index 5bf8116f75..55e96651bd 100644 --- a/src/ol/source/tilesource.js +++ b/src/ol/source/tilesource.js @@ -10,6 +10,7 @@ goog.require('ol.Extent'); goog.require('ol.TileCache'); goog.require('ol.TileRange'); goog.require('ol.TileState'); +goog.require('ol.proj'); goog.require('ol.size'); goog.require('ol.source.Source'); goog.require('ol.tilecoord'); @@ -105,6 +106,7 @@ ol.source.Tile.prototype.expireCache = function(usedTiles) { /** + * @param {ol.proj.Projection} projection * @param {number} z Zoom level. * @param {ol.TileRange} tileRange Tile range. * @param {function(ol.Tile):(boolean|undefined)} callback Called with each @@ -112,15 +114,21 @@ ol.source.Tile.prototype.expireCache = function(usedTiles) { * considered loaded. * @return {boolean} The tile range is fully covered with loaded tiles. */ -ol.source.Tile.prototype.forEachLoadedTile = function(z, tileRange, callback) { +ol.source.Tile.prototype.forEachLoadedTile = + function(projection, z, tileRange, callback) { + var tileCache = this.getTileCacheForProjection(projection); + if (goog.isNull(tileCache)) { + return false; + } + var covered = true; var tile, tileCoordKey, loaded; for (var x = tileRange.minX; x <= tileRange.maxX; ++x) { for (var y = tileRange.minY; y <= tileRange.maxY; ++y) { tileCoordKey = this.getKeyZXY(z, x, y); loaded = false; - if (this.tileCache.containsKey(tileCoordKey)) { - tile = /** @type {!ol.Tile} */ (this.tileCache.get(tileCoordKey)); + if (tileCache.containsKey(tileCoordKey)) { + tile = /** @type {!ol.Tile} */ (tileCache.get(tileCoordKey)); loaded = tile.getState() === ol.TileState.LOADED; if (loaded) { loaded = (callback(tile) !== false); @@ -203,6 +211,21 @@ ol.source.Tile.prototype.getTileGridForProjection = function(projection) { }; +/** + * @param {ol.proj.Projection} projection Projection. + * @return {ol.TileCache} Tile cache. + * @protected + */ +ol.source.Tile.prototype.getTileCacheForProjection = function(projection) { + if (goog.isNull(this.tileCache) || + !ol.proj.equivalent(this.getProjection(), projection)) { + return null; + } else { + return this.tileCache; + } +}; + + /** * @param {number} z Z. * @param {number} pixelRatio Pixel ratio. diff --git a/test/spec/ol/source/tilesource.test.js b/test/spec/ol/source/tilesource.test.js index 59d8fbbc4d..e660f2f520 100644 --- a/test/spec/ol/source/tilesource.test.js +++ b/test/spec/ol/source/tilesource.test.js @@ -26,7 +26,7 @@ describe('ol.source.Tile', function() { var zoom = 3; var range = grid.getTileRangeForExtentAndZ(extent, zoom); - source.forEachLoadedTile(zoom, range, callback); + source.forEachLoadedTile(source.getProjection(), zoom, range, callback); expect(callback.callCount).to.be(0); }); @@ -38,7 +38,7 @@ describe('ol.source.Tile', function() { var zoom = 3; var range = grid.getTileRangeForExtentAndZ(extent, zoom); - source.forEachLoadedTile(zoom, range, callback); + source.forEachLoadedTile(source.getProjection(), zoom, range, callback); expect(source.getTile.callCount).to.be(0); source.getTile.restore(); }); @@ -55,7 +55,7 @@ describe('ol.source.Tile', function() { var zoom = 1; var range = new ol.TileRange(0, 1, 0, 1); - source.forEachLoadedTile(zoom, range, callback); + source.forEachLoadedTile(source.getProjection(), zoom, range, callback); expect(callback.callCount).to.be(3); }); @@ -71,9 +71,10 @@ describe('ol.source.Tile', function() { var zoom = 1; var range = new ol.TileRange(0, 1, 0, 1); - var covered = source.forEachLoadedTile(zoom, range, function() { - return true; - }); + var covered = source.forEachLoadedTile(source.getProjection(), zoom, + range, function() { + return true; + }); expect(covered).to.be(true); }); @@ -89,9 +90,10 @@ describe('ol.source.Tile', function() { var zoom = 1; var range = new ol.TileRange(0, 1, 0, 1); - var covered = source.forEachLoadedTile(zoom, range, function() { - return true; - }); + var covered = source.forEachLoadedTile(source.getProjection(), zoom, + range, function() { + return true; + }); expect(covered).to.be(false); }); @@ -107,9 +109,10 @@ describe('ol.source.Tile', function() { var zoom = 1; var range = new ol.TileRange(0, 1, 0, 1); - var covered = source.forEachLoadedTile(zoom, range, function() { - return false; - }); + var covered = source.forEachLoadedTile(source.getProjection(), zoom, + range, function() { + return false; + }); expect(covered).to.be(false); });