From 7a7ea8a0720fe4bd5bd9b69b09433198a4672a64 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:15:53 +0200 Subject: [PATCH 1/8] Add ol.tilegrid.TileGrid.getTileCoordChildTileRange --- src/ol/tilegrid/tilegrid.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 3952497768..074430cdd4 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -164,6 +164,21 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() { }; +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {ol.TileRange} Tile range. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = + function(tileCoord) { + if (tileCoord.z < this.resolutions_.length) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord); + return this.getTileRangeForExtentAndZ(tileCoordExtent, tileCoord.z + 1); + } else { + return null; + } +}; + + /** * @param {number} z Z. * @param {ol.TileRange} tileRange Tile range. From 4d6e06005201d76099f93da5ebf54df1a8abefe4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:16:38 +0200 Subject: [PATCH 2/8] Use high resolution tiles in WebGL renderer --- src/ol/renderer/webgl/webgltilelayerrenderer.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 231898c477..f20a95f76b 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -199,7 +199,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; - var tile, tileState, x, y; + var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -216,8 +216,14 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = } allTilesLoaded = false; - tileGrid.forEachTileCoordParentTileRange( + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( tile.tileCoord, findLoadedTiles); + if (!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } } From 8da1f3400b9c9b40cd9c8841bf1a100a06bff414 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:18:06 +0200 Subject: [PATCH 3/8] Use high resolution tiles in Canvas renderer --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index f848b553fc..b8c6f833bf 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -201,7 +201,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; - var tile, tileState, x, y; + var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -215,7 +215,14 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = } allTilesLoaded = false; - tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles); + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( + tile.tileCoord, findLoadedTiles); + if (!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } } } From 1b7ee36680e24a183035c96767971e61c390cd33 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:18:26 +0200 Subject: [PATCH 4/8] Use high resolution tiles in DOM renderer --- src/ol/renderer/dom/domtilelayerrenderer.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 0557898f0d..fb7d4babbd 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -115,7 +115,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; - var tile, tileState, x, y; + var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -130,7 +130,14 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = } allTilesLoaded = false; - tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles); + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( + tile.tileCoord, findLoadedTiles); + if (!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } } From c5748f1fd732a51f56656f49f422b9d327906218 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:18:54 +0200 Subject: [PATCH 5/8] Store maxZoom in ol.tilegrid.XYZ --- src/ol/tilegrid/xyztilegrid.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 212c0a52fe..41670261ad 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -15,10 +15,16 @@ goog.require('ol.tilegrid.TileGrid'); */ ol.tilegrid.XYZ = function(options) { - var resolutions = new Array(options.maxZoom + 1); + /** + * @private + * @type {number} + */ + this.maxZoom_ = options.maxZoom; + + var resolutions = new Array(this.maxZoom_ + 1); var z; var size = 2 * ol.projection.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; - for (z = 0; z <= options.maxZoom; ++z) { + for (z = 0; z <= this.maxZoom_; ++z) { resolutions[z] = size / Math.pow(2, z); } From 66f0e0d8e8bd8983897d214ccd91a806c39d8612 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:19:19 +0200 Subject: [PATCH 6/8] Add optimized version of getTileCoordChildTileRange for ol.tilegrid.XYZ --- src/ol/tilegrid/xyztilegrid.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 41670261ad..72572417fb 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -39,6 +39,20 @@ ol.tilegrid.XYZ = function(options) { goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid); +/** + * @inheritDoc + */ +ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord) { + if (tileCoord.z < this.maxZoom_) { + return new ol.TileRange( + tileCoord.x << 1, tileCoord.y << 1, + tileCoord.x + 1 << 1, tileCoord.y + 1 << 1); + } else { + return null; + } +}; + + /** * @inheritDoc */ From cdc67a141a43d4b19d9a101de8cfcb3649d6fa17 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 8 Apr 2013 21:19:41 +0200 Subject: [PATCH 7/8] Remove preload from examples that don't need it --- examples/rotation.js | 1 - examples/stamen.js | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/rotation.js b/examples/rotation.js index f35512783e..15586c06c5 100644 --- a/examples/rotation.js +++ b/examples/rotation.js @@ -8,7 +8,6 @@ goog.require('ol.source.OpenStreetMap'); var map = new ol.Map({ layers: [ new ol.layer.TileLayer({ - preload: 4, source: new ol.source.OpenStreetMap() }) ], diff --git a/examples/stamen.js b/examples/stamen.js index 6ece212402..4e9a510bde 100644 --- a/examples/stamen.js +++ b/examples/stamen.js @@ -9,7 +9,6 @@ goog.require('ol.source.Stamen'); var map = new ol.Map({ layers: [ new ol.layer.TileLayer({ - preload: 4, source: new ol.source.Stamen({ layer: 'watercolor' }) From e732a6738273a063800b708baf26eeeeef5a7844 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 02:30:24 +0200 Subject: [PATCH 8/8] Propagate return value --- src/ol/tilegrid/tilegrid.js | 4 +++- src/ol/tilegrid/xyztilegrid.js | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 074430cdd4..a210631eed 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -96,6 +96,7 @@ ol.tilegrid.TileGrid = function(options) { * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(this: T, number, ol.TileRange): boolean} callback Callback. * @param {T=} opt_obj Object. + * @return {boolean} Callback succeeded. * @template T */ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = @@ -105,10 +106,11 @@ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = while (z >= 0) { if (callback.call( opt_obj, z, this.getTileRangeForExtentAndZ(tileCoordExtent, z))) { - return; + return true; } --z; } + return false; }; diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 72572417fb..49829503b2 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -64,7 +64,8 @@ ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange = tileRange.minX = tileRange.maxX >>= 1; tileRange.minY = tileRange.maxY >>= 1; if (callback.call(opt_obj, z, tileRange)) { - break; + return true; } } + return false; };