Merge pull request #258 from bbinet/tilegrid-tilesizes
Add support for multiple tileSizes in the tilegrid
This commit is contained in:
@@ -134,6 +134,7 @@
|
||||
@exportObjectLiteralProperty ol.tilegrid.TileGridOptions.origins Array.<ol.Coordinate>|undefined
|
||||
@exportObjectLiteralProperty ol.tilegrid.TileGridOptions.resolutions !Array.<number>
|
||||
@exportObjectLiteralProperty ol.tilegrid.TileGridOptions.tileSize ol.Size|undefined
|
||||
@exportObjectLiteralProperty ol.tilegrid.TileGridOptions.tileSizes Array.<ol.Size>|undefined
|
||||
|
||||
@exportObjectLiteral ol.tilegrid.XYZOptions
|
||||
@exportObjectLiteralProperty ol.tilegrid.XYZOptions.maxZoom number
|
||||
|
||||
@@ -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);
|
||||
@@ -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) {
|
||||
|
||||
@@ -138,7 +138,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
|
||||
/** @type {Object.<number, boolean>} */
|
||||
var newTileLayerZKeys = {};
|
||||
|
||||
var tileSize = tileGrid.getTileSize();
|
||||
var iz, tileCoordKey, tileCoordOrigin, tileLayerZ, tileLayerZKey, tilesToDraw;
|
||||
for (iz = 0; iz < zs.length; ++iz) {
|
||||
tileLayerZKey = zs[iz];
|
||||
@@ -293,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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -33,7 +33,7 @@ ol.DebugTile_ = function(tileCoord, tileGrid) {
|
||||
* @private
|
||||
* @type {ol.Size}
|
||||
*/
|
||||
this.tileSize_ = tileGrid.getTileSize();
|
||||
this.tileSize_ = tileGrid.getTileSize(tileCoord.z);
|
||||
|
||||
/**
|
||||
* @private
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -58,6 +58,19 @@ 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
|
||||
* @type {Array.<ol.Size>}
|
||||
*/
|
||||
this.tileSizes_ = null;
|
||||
if (goog.isDef(tileGridOptions.tileSizes)) {
|
||||
this.tileSizes_ = tileGridOptions.tileSizes;
|
||||
goog.asserts.assert(this.tileSizes_.length == this.resolutions_.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
@@ -65,7 +78,11 @@ ol.tilegrid.TileGrid = function(tileGridOptions) {
|
||||
*/
|
||||
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_)));
|
||||
|
||||
};
|
||||
|
||||
@@ -114,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;
|
||||
@@ -152,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;
|
||||
@@ -194,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);
|
||||
@@ -208,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;
|
||||
@@ -246,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);
|
||||
@@ -286,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];
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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() {
|
||||
@@ -94,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() {
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user