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