From f7a895a8236c0eb773993df87e1dd021546aa28d Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Sun, 3 Mar 2013 19:54:21 +0100 Subject: [PATCH 1/6] Remove unused tileGrid.getTileSize() call. --- src/ol/renderer/dom/domtilelayerrenderer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 9b5dd26b32..402b3edfaa 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -138,7 +138,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = /** @type {Object.} */ var newTileLayerZKeys = {}; - var tileSize = tileGrid.getTileSize(); var iz, tileCoordKey, tileCoordOrigin, tileLayerZ, tileLayerZKey, tilesToDraw; for (iz = 0; iz < zs.length; ++iz) { tileLayerZKey = zs[iz]; From 7c440d087f0eb616917a443c9857f8a0d0a40515 Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Sun, 3 Mar 2013 20:32:39 +0100 Subject: [PATCH 2/6] Ensure we cannot set both origin and origins in the tilegrid --- src/ol/tilegrid/tilegrid.js | 3 +++ test/spec/ol/tilegrid.test.js | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 7b65dd5cdb..52d449d084 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -58,6 +58,9 @@ ol.tilegrid.TileGrid = function(tileGridOptions) { this.origins_ = tileGridOptions.origins; goog.asserts.assert(this.origins_.length == this.resolutions_.length); } + goog.asserts.assert( + (goog.isNull(this.origin_) && !goog.isNull(this.origins_)) || + (!goog.isNull(this.origin_) && goog.isNull(this.origins_))); /** * @private diff --git a/test/spec/ol/tilegrid.test.js b/test/spec/ol/tilegrid.test.js index 1c93439115..bb118dd1d8 100644 --- a/test/spec/ol/tilegrid.test.js +++ b/test/spec/ol/tilegrid.test.js @@ -68,6 +68,20 @@ describe('ol.tilegrid.TileGrid', function() { }); }); + describe('create with both origin and multiple origins', function() { + it('throws an exception', function() { + expect(function() { + return new ol.tilegrid.TileGrid({ + resolutions: [100, 50, 25, 10], + extent: extent, + origins: [origin, origin, origin, origin], + origin: origin, + tileSize: tileSize + }); + }).toThrow(); + }); + }); + describe('create with too few origins', function() { it('throws an exception', function() { expect(function() { From 2816e3256cf213716109f16e990557c63c2ebd85 Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Sun, 3 Mar 2013 20:37:45 +0100 Subject: [PATCH 3/6] Add support for multiple tileSizes in the tilegrid. This is needed by WMTS. --- src/objectliterals.exports | 1 + .../canvas/canvastilelayerrenderer.js | 2 +- src/ol/renderer/dom/domtilelayerrenderer.js | 2 +- .../renderer/webgl/webgltilelayerrenderer.js | 2 +- src/ol/source/debugtilesource.js | 2 +- src/ol/source/tiledwmssource.js | 3 -- src/ol/tilegrid/tilegrid.js | 37 +++++++++++++++---- src/ol/tileurlfunction.js | 6 ++- 8 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/objectliterals.exports b/src/objectliterals.exports index 3e0d0e4f1a..8e817820f2 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -134,6 +134,7 @@ @exportObjectLiteralProperty ol.tilegrid.TileGridOptions.origins Array.|undefined @exportObjectLiteralProperty ol.tilegrid.TileGridOptions.resolutions !Array. @exportObjectLiteralProperty ol.tilegrid.TileGridOptions.tileSize ol.Size|undefined +@exportObjectLiteralProperty ol.tilegrid.TileGridOptions.tileSizes Array.|undefined @exportObjectLiteral ol.tilegrid.XYZOptions @exportObjectLiteralProperty ol.tilegrid.XYZOptions.maxZoom number diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 8204edcf33..617a1e2e65 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -91,8 +91,8 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = var tileSource = tileLayer.getTileSource(); var tileSourceKey = goog.getUid(tileSource).toString(); var tileGrid = tileSource.getTileGrid(); - var tileSize = tileGrid.getTileSize(); var z = tileGrid.getZForResolution(view2DState.resolution); + var tileSize = tileGrid.getTileSize(z); var tileResolution = tileGrid.getResolution(z); var tileRange = tileGrid.getTileRangeForExtentAndResolution( frameState.extent, tileResolution); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 402b3edfaa..f51382b4d9 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -292,7 +292,7 @@ ol.renderer.dom.TileLayerZ_.prototype.addTile = function(tile) { if (tileCoordKey in this.tiles_) { return; } - var tileSize = this.tileGrid_.getTileSize(); + var tileSize = this.tileGrid_.getTileSize(tileCoord.z); var image = tile.getImage(this); var style = image.style; style.position = 'absolute'; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 9b75e0d0b1..f2a0219586 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -299,7 +299,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = } else { var tileRangeSize = tileRange.getSize(); - var tileSize = tileGrid.getTileSize(); + var tileSize = tileGrid.getTileSize(z); var maxDimension = Math.max( tileRangeSize.width * tileSize.width, diff --git a/src/ol/source/debugtilesource.js b/src/ol/source/debugtilesource.js index 8cd712d584..e553081ae3 100644 --- a/src/ol/source/debugtilesource.js +++ b/src/ol/source/debugtilesource.js @@ -33,7 +33,7 @@ ol.DebugTile_ = function(tileCoord, tileGrid) { * @private * @type {ol.Size} */ - this.tileSize_ = tileGrid.getTileSize(); + this.tileSize_ = tileGrid.getTileSize(tileCoord.z); /** * @private diff --git a/src/ol/source/tiledwmssource.js b/src/ol/source/tiledwmssource.js index c3e3838b98..9c7eb5ec8c 100644 --- a/src/ol/source/tiledwmssource.js +++ b/src/ol/source/tiledwmssource.js @@ -46,9 +46,6 @@ ol.source.TiledWMS = function(tiledWMSOptions) { 'FORMAT': 'image/png', 'TRANSPARENT': true }; - var tileSize = tileGrid.getTileSize(); - baseParams['WIDTH'] = tileSize.width; - baseParams['HEIGHT'] = tileSize.height; baseParams[version >= '1.3' ? 'CRS' : 'SRS'] = projection.getCode(); goog.object.extend(baseParams, tiledWMSOptions.params); diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 52d449d084..415557d93e 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -62,13 +62,27 @@ ol.tilegrid.TileGrid = function(tileGridOptions) { (goog.isNull(this.origin_) && !goog.isNull(this.origins_)) || (!goog.isNull(this.origin_) && goog.isNull(this.origins_))); + /** + * @private + * @type {Array.} + */ + this.tileSizes_ = null; + if (goog.isDef(tileGridOptions.tileSizes)) { + this.tileSizes_ = tileGridOptions.tileSizes; + goog.asserts.assert(this.tileSizes_.length == this.resolutions_.length); + } + /** * @private * @type {ol.Size} */ this.tileSize_ = goog.isDef(tileGridOptions.tileSize) ? tileGridOptions.tileSize : - new ol.Size(ol.DEFAULT_TILE_SIZE, ol.DEFAULT_TILE_SIZE); + goog.isNull(this.tileSizes_) ? + new ol.Size(ol.DEFAULT_TILE_SIZE, ol.DEFAULT_TILE_SIZE) : null; + goog.asserts.assert( + (goog.isNull(this.tileSize_) && !goog.isNull(this.tileSizes_)) || + (!goog.isNull(this.tileSize_) && goog.isNull(this.tileSizes_))); }; @@ -117,7 +131,7 @@ ol.tilegrid.TileGrid.prototype.getOrigin = function(z) { ol.tilegrid.TileGrid.prototype.getPixelBoundsForTileCoordAndResolution = function(tileCoord, resolution) { var scale = resolution / this.getResolution(tileCoord.z); - var tileSize = this.getTileSize(); + var tileSize = this.getTileSize(tileCoord.z); tileSize = new ol.Size(tileSize.width / scale, tileSize.height / scale); var minX, maxX, minY, maxY; @@ -155,7 +169,7 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() { ol.tilegrid.TileGrid.prototype.getTileRangeExtent = function(z, tileRange) { var origin = this.getOrigin(z); var resolution = this.getResolution(z); - var tileSize = this.tileSize_; + var tileSize = this.getTileSize(z); var minX = origin.x + tileRange.minX * tileSize.width * resolution; var minY = origin.y + tileRange.minY * tileSize.height * resolution; var maxX = origin.x + (tileRange.maxX + 1) * tileSize.width * resolution; @@ -197,7 +211,7 @@ ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ = function(extent, z) { ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); - var tileSize = this.tileSize_; + var tileSize = this.getTileSize(tileCoord.z); var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; var y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; return new ol.Coordinate(x, y); @@ -211,7 +225,7 @@ ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { ol.tilegrid.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); - var tileSize = this.tileSize_; + var tileSize = this.getTileSize(tileCoord.z); var minX = origin.x + tileCoord.x * tileSize.width * resolution; var minY = origin.y + tileCoord.y * tileSize.height * resolution; var maxX = minX + tileSize.width * resolution; @@ -249,7 +263,7 @@ ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution_ = function( var z = this.getZForResolution(resolution); var scale = resolution / this.getResolution(z); var origin = this.getOrigin(z); - var tileSize = this.getTileSize(); + var tileSize = this.getTileSize(z); var x = scale * (coordinate.x - origin.x) / (resolution * tileSize.width); var y = scale * (coordinate.y - origin.y) / (resolution * tileSize.height); @@ -289,10 +303,17 @@ ol.tilegrid.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { /** + * @param {number} z Z. * @return {ol.Size} Tile size. */ -ol.tilegrid.TileGrid.prototype.getTileSize = function() { - return this.tileSize_; +ol.tilegrid.TileGrid.prototype.getTileSize = function(z) { + if (!goog.isNull(this.tileSize_)) { + return this.tileSize_; + } else { + goog.asserts.assert(!goog.isNull(this.tileSizes_)); + goog.asserts.assert(0 <= z && z < this.tileSizes_.length); + return this.tileSizes_[z]; + } }; diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js index e5e3dfc3e6..d64c57ec9e 100644 --- a/src/ol/tileurlfunction.js +++ b/src/ol/tileurlfunction.js @@ -86,7 +86,11 @@ ol.TileUrlFunction.createBboxParam = var bboxValues = axisOrientation.substr(0, 2) == 'ne' ? [tileExtent.minY, tileExtent.minX, tileExtent.maxY, tileExtent.maxX] : [tileExtent.minX, tileExtent.minY, tileExtent.maxX, tileExtent.maxY]; - return goog.uri.utils.appendParam(baseUrl, 'BBOX', bboxValues.join(',')); + var tileSize = tileGrid.getTileSize(tileCoord.z); + return goog.uri.utils.appendParams(baseUrl, + 'BBOX', bboxValues.join(','), + 'HEIGHT', tileSize.height, + 'WIDTH', tileSize.width); } }; }; From bf325c38b44671deacafcb1ab735004906bfe422 Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Sun, 3 Mar 2013 20:38:40 +0100 Subject: [PATCH 4/6] Fix tests related to createBboxParam. --- test/spec/ol/tileurlfunction.test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/tileurlfunction.test.js b/test/spec/ol/tileurlfunction.test.js index b11180f811..62f245f5c9 100644 --- a/test/spec/ol/tileurlfunction.test.js +++ b/test/spec/ol/tileurlfunction.test.js @@ -75,7 +75,8 @@ describe('ol.TileUrlFunction', function() { var tileCoord = new ol.TileCoord(1, 0, 0); var tileUrl = tileUrlFunction(tileCoord); var expected = 'http://wms?foo=bar&BBOX=-20037508.342789244' + - '%2C20037508.342789244%2C0%2C40075016.68557849'; + '%2C20037508.342789244%2C0%2C40075016.68557849' + + '&HEIGHT=256&WIDTH=256'; expect(tileUrl).toEqual(expected); }); it('creates expected URL respecting axis orientation', function() { @@ -85,7 +86,8 @@ describe('ol.TileUrlFunction', function() { var tileCoord = new ol.TileCoord(1, 0, 0); var tileUrl = tileUrlFunction(tileCoord); var expected = 'http://wms?foo=bar&BBOX=20037508.342789244' + - '%2C-20037508.342789244%2C40075016.68557849%2C0'; + '%2C-20037508.342789244%2C40075016.68557849%2C0' + + '&HEIGHT=256&WIDTH=256'; expect(tileUrl).toEqual(expected); }); }); From 93131d610518ec0438682b2186ebf7b3ec15caa1 Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Sun, 3 Mar 2013 20:39:22 +0100 Subject: [PATCH 5/6] Add some tests for the multiple tileSizes in tilegrid. --- test/spec/ol/tilegrid.test.js | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/test/spec/ol/tilegrid.test.js b/test/spec/ol/tilegrid.test.js index bb118dd1d8..3c24a17167 100644 --- a/test/spec/ol/tilegrid.test.js +++ b/test/spec/ol/tilegrid.test.js @@ -108,6 +108,59 @@ describe('ol.tilegrid.TileGrid', function() { }); }); + describe('create with multiple tileSizes', function() { + it('does not throw an exception', function() { + expect(function() { + return new ol.tilegrid.TileGrid({ + resolutions: [100, 50, 25, 10], + extent: extent, + tileSizes: [tileSize, tileSize, tileSize, tileSize], + origin: origin + }); + }).not.toThrow(); + }); + }); + + describe('create with both tileSize and multiple tileSizes', function() { + it('throws an exception', function() { + expect(function() { + return new ol.tilegrid.TileGrid({ + resolutions: [100, 50, 25, 10], + extent: extent, + tileSizes: [tileSize, tileSize, tileSize, tileSize], + tileSize: tileSize, + origin: origin + }); + }).toThrow(); + }); + }); + + describe('create with too few tileSizes', function() { + it('throws an exception', function() { + expect(function() { + return new ol.tilegrid.TileGrid({ + resolutions: [100, 50, 25, 10], + extent: extent, + tileSizes: [tileSize, tileSize, tileSize], + origin: origin + }); + }).toThrow(); + }); + }); + + describe('create with too many tileSizes', function() { + it('throws an exception', function() { + expect(function() { + return new ol.tilegrid.TileGrid({ + resolutions: [100, 50, 25, 10], + extent: extent, + tileSizes: [tileSize, tileSize, tileSize, tileSize, tileSize], + origin: origin + }); + }).toThrow(); + }); + }); + describe('createForProjection', function() { it('allows easier creation of a tile grid', function() { From 07e0fc3a2077c401548c072b8f17272634211cce Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Mon, 4 Mar 2013 07:30:33 +0100 Subject: [PATCH 6/6] Fix tileSize in the canvastilelayerrenderer. --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 617a1e2e65..9c338b7818 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -174,6 +174,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = var currentZ, i, scale, tileCoordKey, tileExtent, tilesToDraw; for (i = 0; i < zs.length; ++i) { currentZ = zs[i]; + tileSize = tileGrid.getTileSize(currentZ); tilesToDraw = tilesToDrawByZ[currentZ]; if (currentZ == z) { for (tileCoordKey in tilesToDraw) {