From eb31b75caa11bce95f0382139f604d61694ac07c Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 2 Sep 2017 15:38:25 -0600 Subject: [PATCH 1/2] Fast path for child range when zoom factor is 2 --- src/ol/tilegrid/tilegrid.js | 32 ++++++++++++++++++++++++-- test/spec/ol/tilegrid/tilegrid.test.js | 20 ++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 93b49ee7e7..f5a099eaf9 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -37,6 +37,30 @@ ol.tilegrid.TileGrid = function(options) { return b - a; }, true), 17); // `resolutions` must be sorted in descending order + + // check if we've got a consistent zoom factor and origin + var zoomFactor; + if (!options.origins) { + for (var i = 0, ii = this.resolutions_.length - 1; i < ii; ++i) { + if (!zoomFactor) { + zoomFactor = this.resolutions_[i] / this.resolutions_[i + 1]; + } else { + if (this.resolutions_[i] / this.resolutions_[i + 1] !== zoomFactor) { + zoomFactor = undefined; + break; + } + } + } + } + + + /** + * @private + * @type {number|undefined} + */ + this.zoomFactor_ = zoomFactor; + + /** * @protected * @type {number} @@ -248,12 +272,16 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() { */ ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = function(tileCoord, opt_tileRange, opt_extent) { if (tileCoord[0] < this.maxZoom) { + if (this.zoomFactor_ === 2) { + var minX = tileCoord[1] * 2; + var minY = tileCoord[2] * 2; + return ol.TileRange.createOrUpdate(minX, minX + 1, minY, minY + 1, opt_tileRange); + } var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); return this.getTileRangeForExtentAndZ( tileCoordExtent, tileCoord[0] + 1, opt_tileRange); - } else { - return null; } + return null; }; diff --git a/test/spec/ol/tilegrid/tilegrid.test.js b/test/spec/ol/tilegrid/tilegrid.test.js index 650653a0ea..21ac5e381b 100644 --- a/test/spec/ol/tilegrid/tilegrid.test.js +++ b/test/spec/ol/tilegrid/tilegrid.test.js @@ -287,6 +287,26 @@ describe('ol.tilegrid.TileGrid', function() { }); }); + describe('#zoomFactor_', function() { + it('is set for a consistent zoom factor', function() { + var grid = new ol.tilegrid.TileGrid({ + resolutions: [10, 5, 2.5, 1.25], + origin: origin, + tileSize: tileSize + }); + expect(grid.zoomFactor_).to.be(2); + }); + + it('is not set for an inconsistent zoom factor', function() { + var grid = new ol.tilegrid.TileGrid({ + resolutions: [10, 5, 3, 1.25], + origin: origin, + tileSize: tileSize + }); + expect(grid.zoomFactor_).to.be(undefined); + }); + }); + describe('createForProjection', function() { it('allows easier creation of a tile grid', function() { From d777edcc052b2695fdad3fa70d46d32759246d60 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 2 Sep 2017 20:36:38 -0600 Subject: [PATCH 2/2] Fast path for parent range when zoom factor is 2 --- src/ol/tilegrid/tilegrid.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index f5a099eaf9..bc933cf28c 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -186,11 +186,24 @@ ol.tilegrid.TileGrid.prototype.forEachTileCoord = function(extent, zoom, callbac * @template T */ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = function(tileCoord, callback, opt_this, opt_tileRange, opt_extent) { - var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + var tileRange, x, y; + var tileCoordExtent = null; var z = tileCoord[0] - 1; + if (this.zoomFactor_ === 2) { + x = tileCoord[1]; + y = tileCoord[2]; + } else { + tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + } while (z >= this.minZoom) { - if (callback.call(opt_this, z, - this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange))) { + if (this.zoomFactor_ === 2) { + x = Math.floor(x / 2); + y = Math.floor(y / 2); + tileRange = ol.TileRange.createOrUpdate(x, x, y, y, opt_tileRange); + } else { + tileRange = this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange); + } + if (callback.call(opt_this, z, tileRange)) { return true; } --z;