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);
});