Merge pull request #450 from elemoine/projection-null

Do not pass tile grid to getTile and tileUrlFunc
This commit is contained in:
Éric Lemoine
2013-04-03 00:59:05 -07:00
12 changed files with 54 additions and 48 deletions
@@ -195,7 +195,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}, tileSource, tileGrid, projection); }, tileSource, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -204,7 +204,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, tileGrid, projection); tile = tileSource.getTile(z, x, y, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED || tileState == ol.TileState.EMPTY) { if (tileState == ol.TileState.LOADED || tileState == ol.TileState.EMPTY) {
tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; tilesToDrawByZ[z][tile.tileCoord.toString()] = tile;
+2 -2
View File
@@ -107,7 +107,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}, tileSource, tileGrid, projection); }, tileSource, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -116,7 +116,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, tileGrid, projection); tile = tileSource.getTile(z, x, y, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED) { if (tileState == ol.TileState.LOADED) {
tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; tilesToDrawByZ[z][tile.tileCoord.toString()] = tile;
+3 -4
View File
@@ -249,15 +249,14 @@ ol.renderer.Layer.prototype.updateUsedTiles =
* @param {function(ol.Tile): boolean} isLoadedFunction Function to * @param {function(ol.Tile): boolean} isLoadedFunction Function to
* determine if the tile is loaded. * determine if the tile is loaded.
* @param {ol.source.TileSource} tileSource Tile source. * @param {ol.source.TileSource} tileSource Tile source.
* @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
* @param {ol.Projection} projection Projection. * @param {ol.Projection} projection Projection.
* @return {function(number, number, number): ol.Tile} Returns a tile if it is * @return {function(number, number, number): ol.Tile} Returns a tile if it is
* loaded. * loaded.
*/ */
ol.renderer.Layer.prototype.createGetTileIfLoadedFunction = ol.renderer.Layer.prototype.createGetTileIfLoadedFunction =
function(isLoadedFunction, tileSource, tileGrid, projection) { function(isLoadedFunction, tileSource, projection) {
return function(z, x, y) { return function(z, x, y) {
var tile = tileSource.getTile(z, x, y, tileGrid, projection); var tile = tileSource.getTile(z, x, y, projection);
return isLoadedFunction(tile) ? tile : null; return isLoadedFunction(tile) ? tile : null;
}; };
}; };
@@ -314,7 +313,7 @@ ol.renderer.Layer.prototype.manageTilePyramid = function(
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
if (currentZ - z <= preload) { if (currentZ - z <= preload) {
tile = tileSource.getTile(z, x, y, tileGrid, projection); tile = tileSource.getTile(z, x, y, projection);
if (tile.getState() == ol.TileState.IDLE) { if (tile.getState() == ol.TileState.IDLE) {
wantedTiles[tile.tileCoord.toString()] = true; wantedTiles[tile.tileCoord.toString()] = true;
if (!tileQueue.isKeyQueued(tile.getKey())) { if (!tileQueue.isKeyQueued(tile.getKey())) {
@@ -205,7 +205,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED && return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED &&
mapRenderer.isTileTextureLoaded(tile); mapRenderer.isTileTextureLoaded(tile);
}, tileSource, tileGrid, projection); }, tileSource, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -214,7 +214,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, tileGrid, projection); tile = tileSource.getTile(z, x, y, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED) { if (tileState == ol.TileState.LOADED) {
if (mapRenderer.isTileTextureLoaded(tile)) { if (mapRenderer.isTileTextureLoaded(tile)) {
+3 -1
View File
@@ -103,7 +103,9 @@ ol.source.BingMaps.prototype.handleImageryMetadataResponse =
var imageUrl = resource.imageUrl var imageUrl = resource.imageUrl
.replace('{subdomain}', subdomain) .replace('{subdomain}', subdomain)
.replace('{culture}', culture); .replace('{culture}', culture);
return function(tileCoord) { return function(tileCoord, projection) {
goog.asserts.assert(ol.projection.equivalent(
projection, this.getProjection()));
if (goog.isNull(tileCoord)) { if (goog.isNull(tileCoord)) {
return undefined; return undefined;
} else { } else {
+2 -4
View File
@@ -87,16 +87,14 @@ ol.source.ImageTileSource.prototype.expireCache = function(usedTiles) {
/** /**
* @inheritDoc * @inheritDoc
*/ */
ol.source.ImageTileSource.prototype.getTile = ol.source.ImageTileSource.prototype.getTile = function(z, x, y, projection) {
function(z, x, y, tileGrid, projection) {
var tileCoordKey = ol.TileCoord.getKeyZXY(z, x, y); var tileCoordKey = ol.TileCoord.getKeyZXY(z, x, y);
if (this.tileCache_.containsKey(tileCoordKey)) { if (this.tileCache_.containsKey(tileCoordKey)) {
return /** @type {!ol.Tile} */ (this.tileCache_.get(tileCoordKey)); return /** @type {!ol.Tile} */ (this.tileCache_.get(tileCoordKey));
} else { } else {
goog.asserts.assert(tileGrid);
goog.asserts.assert(projection); goog.asserts.assert(projection);
var tileCoord = new ol.TileCoord(z, x, y); var tileCoord = new ol.TileCoord(z, x, y);
var tileUrl = this.tileUrlFunction(tileCoord, tileGrid, projection); var tileUrl = this.tileUrlFunction(tileCoord, projection);
var tile = new ol.ImageTile( var tile = new ol.ImageTile(
tileCoord, tileCoord,
goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY, goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY,
+5 -1
View File
@@ -42,7 +42,11 @@ ol.source.TiledWMS = function(tiledWMSOptions) {
tiledWMSOptions.params['TRANSPARENT'] : true; tiledWMSOptions.params['TRANSPARENT'] : true;
var extent = tiledWMSOptions.extent; var extent = tiledWMSOptions.extent;
var tileCoordTransform = function(tileCoord, tileGrid, projection) { var tileCoordTransform = function(tileCoord, projection) {
var tileGrid = this.getTileGrid();
if (goog.isNull(tileGrid)) {
tileGrid = ol.tilegrid.getForProjection(projection);
}
if (tileGrid.getResolutions().length <= tileCoord.z) { if (tileGrid.getResolutions().length <= tileCoord.z) {
return null; return null;
} }
-1
View File
@@ -124,7 +124,6 @@ ol.source.TileSource.prototype.getResolutions = function() {
* @param {number} z Tile coordinate z. * @param {number} z Tile coordinate z.
* @param {number} x Tile coordinate x. * @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y. * @param {number} y Tile coordinate y.
* @param {ol.tilegrid.TileGrid=} opt_tileGrid Tile grid.
* @param {ol.Projection=} opt_projection Projection. * @param {ol.Projection=} opt_projection Projection.
* @return {!ol.Tile} Tile. * @return {!ol.Tile} Tile.
*/ */
+3 -1
View File
@@ -112,7 +112,9 @@ ol.source.WMTS = function(wmtsOptions) {
} }
tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(
function(tileCoord, tileGrid, projection) { function(tileCoord, projection) {
var tileGrid = this.getTileGrid();
goog.asserts.assert(!goog.isNull(tileGrid));
if (tileGrid.getResolutions().length <= tileCoord.z) { if (tileGrid.getResolutions().length <= tileCoord.z) {
return null; return null;
} }
+18 -14
View File
@@ -4,11 +4,10 @@ goog.provide('ol.TileUrlFunctionType');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.math'); goog.require('goog.math');
goog.require('ol.TileCoord'); goog.require('ol.TileCoord');
goog.require('ol.tilegrid.TileGrid');
/** /**
* @typedef {function(this:ol.source.Source, ol.TileCoord, ol.tilegrid.TileGrid, * @typedef {function(this:ol.source.ImageTileSource, ol.TileCoord,
* ol.Projection): (string|undefined)} * ol.Projection): (string|undefined)}
*/ */
ol.TileUrlFunctionType; ol.TileUrlFunctionType;
@@ -49,12 +48,12 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) {
if (tileUrlFunctions.length === 1) { if (tileUrlFunctions.length === 1) {
return tileUrlFunctions[0]; return tileUrlFunctions[0];
} }
return function(tileCoord, tileGrid, projection) { return function(tileCoord, projection) {
if (goog.isNull(tileCoord)) { if (goog.isNull(tileCoord)) {
return undefined; return undefined;
} else { } else {
var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length); var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length);
return tileUrlFunctions[index](tileCoord, tileGrid, projection); return tileUrlFunctions[index].call(this, tileCoord, projection);
} }
}; };
}; };
@@ -63,20 +62,24 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) {
/** /**
* @param {string} baseUrl Base URL (may have query data). * @param {string} baseUrl Base URL (may have query data).
* @param {Object.<string,*>} params to encode in the url. * @param {Object.<string,*>} params to encode in the url.
* @param {function(string, Object.<string,*>, ol.Extent, ol.Size, * @param {function(this: ol.source.ImageTileSource, string, Object.<string,*>,
* ol.Projection)} paramsFunction params function. * ol.Extent, ol.Size, ol.Projection)} paramsFunction params function.
* @return {ol.TileUrlFunctionType} Tile URL function. * @return {ol.TileUrlFunctionType} Tile URL function.
*/ */
ol.TileUrlFunction.createFromParamsFunction = ol.TileUrlFunction.createFromParamsFunction =
function(baseUrl, params, paramsFunction) { function(baseUrl, params, paramsFunction) {
return function(tileCoord, tileGrid, projection) { return function(tileCoord, projection) {
if (goog.isNull(tileCoord)) { if (goog.isNull(tileCoord)) {
return undefined; return undefined;
} else { } else {
var tileGrid = this.getTileGrid();
if (goog.isNull(tileGrid)) {
tileGrid = ol.tilegrid.getForProjection(projection);
}
var size = tileGrid.getTileSize(tileCoord.z); var size = tileGrid.getTileSize(tileCoord.z);
var extent = tileGrid.getTileCoordExtent(tileCoord); var extent = tileGrid.getTileCoordExtent(tileCoord);
return paramsFunction( return paramsFunction.call(this, baseUrl, params,
baseUrl, params, extent, size, projection); extent, size, projection);
} }
}; };
}; };
@@ -84,27 +87,28 @@ ol.TileUrlFunction.createFromParamsFunction =
/** /**
* @param {ol.TileCoord} tileCoord Tile coordinate. * @param {ol.TileCoord} tileCoord Tile coordinate.
* @param {ol.Projection} projection Projection.
* @return {string|undefined} Tile URL. * @return {string|undefined} Tile URL.
*/ */
ol.TileUrlFunction.nullTileUrlFunction = function(tileCoord) { ol.TileUrlFunction.nullTileUrlFunction = function(tileCoord, projection) {
return undefined; return undefined;
}; };
/** /**
* @param {function(ol.TileCoord, ol.tilegrid.TileGrid, ol.Projection): * @param {function(this:ol.source.ImageTileSource, ol.TileCoord,
* ol.TileCoord} transformFn Transform.function. * ol.Projection) : ol.TileCoord} transformFn Transform function.
* @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function.
* @return {ol.TileUrlFunctionType} Tile URL function. * @return {ol.TileUrlFunctionType} Tile URL function.
*/ */
ol.TileUrlFunction.withTileCoordTransform = ol.TileUrlFunction.withTileCoordTransform =
function(transformFn, tileUrlFunction) { function(transformFn, tileUrlFunction) {
return function(tileCoord, tileGrid, projection) { return function(tileCoord, projection) {
if (goog.isNull(tileCoord)) { if (goog.isNull(tileCoord)) {
return undefined; return undefined;
} else { } else {
return tileUrlFunction.call(this, return tileUrlFunction.call(this,
transformFn(tileCoord, tileGrid, projection), tileGrid, projection); transformFn.call(this, tileCoord, projection), projection);
} }
}; };
}; };
+11 -14
View File
@@ -5,35 +5,32 @@ describe('ol.source.wms', function() {
describe('ol.source.wms.getUrl', function() { describe('ol.source.wms.getUrl', function() {
it('creates expected URL', function() { it('creates expected URL', function() {
var epsg3857 = ol.projection.get('EPSG:3857'); var epsg3857 = ol.projection.get('EPSG:3857');
var tileGrid = ol.tilegrid.getForProjection(epsg3857); var extent = new ol.Extent(
var tileUrlFunction = ol.TileUrlFunction.createFromParamsFunction( -20037508.342789244, -20037508.342789244, 0, 0);
'http://wms', {'foo': 'bar'}, ol.source.wms.getUrl);
var tileCoord = new ol.TileCoord(1, 0, 0);
var tileUrl = tileUrlFunction(tileCoord, tileGrid, epsg3857);
var expected = 'http://wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=' + var expected = 'http://wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=' +
'GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&HEIGHT=256&' + 'GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&HEIGHT=256&' +
'foo=bar&STYLES=&CRS=EPSG%3A3857&BBOX=' + 'foo=bar&STYLES=&CRS=EPSG%3A3857&BBOX=' +
'-20037508.342789244%2C-20037508.342789244%2C0%2C0'; '-20037508.342789244%2C-20037508.342789244%2C0%2C0';
expect(tileUrl).to.eql(expected); var url = ol.source.wms.getUrl('http://wms', {'foo': 'bar'},
extent, new ol.Size(256, 256), epsg3857);
expect(url).to.eql(expected);
}); });
it('creates expected URL respecting axis orientation', function() { it('creates expected URL respecting axis orientation', function() {
var epsg4326 = ol.projection.get('EPSG:4326'); var epsg4326 = ol.projection.get('EPSG:4326');
var tileGrid = ol.tilegrid.getForProjection(epsg4326); var extent = new ol.Extent(-180, -90, 0, 90);
var tileUrlFunction = ol.TileUrlFunction.createFromParamsFunction(
'http://wms', {'foo': 'bar'}, ol.source.wms.getUrl);
var tileCoord = new ol.TileCoord(1, 0, 0);
var tileUrl = tileUrlFunction(tileCoord, tileGrid, epsg4326);
var expected = 'http://wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=' + var expected = 'http://wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=' +
'GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&HEIGHT=256&' + 'GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&HEIGHT=256&' +
'foo=bar&STYLES=&CRS=EPSG%3A4326&BBOX=-90%2C-180%2C90%2C0'; 'foo=bar&STYLES=&CRS=EPSG%3A4326&BBOX=-90%2C-180%2C90%2C0';
expect(tileUrl).to.eql(expected); var url = ol.source.wms.getUrl('http://wms', {'foo': 'bar'},
extent, new ol.Size(256, 256), epsg4326);
expect(url).to.eql(expected);
}); });
}); });
}); });
goog.require('ol.TileCoord'); goog.require('ol.Extent');
goog.require('ol.TileUrlFunction'); goog.require('ol.Size');
goog.require('ol.projection'); goog.require('ol.projection');
goog.require('ol.source.wms'); goog.require('ol.source.wms');
+3 -2
View File
@@ -81,12 +81,13 @@ describe('ol.TileUrlFunction', function() {
describe('createFromParamsFunction', function() { describe('createFromParamsFunction', function() {
var paramsFunction = function(url, params) { return arguments; }; var paramsFunction = function(url, params) { return arguments; };
var projection = ol.projection.get('EPSG:3857'); var projection = ol.projection.get('EPSG:3857');
var fakeTileSource = {getTileGrid: function() {return null;}};
var params = {foo: 'bar'}; var params = {foo: 'bar'};
var tileUrlFunction = ol.TileUrlFunction.createFromParamsFunction( var tileUrlFunction = ol.TileUrlFunction.createFromParamsFunction(
'url', params, paramsFunction); 'url', params, paramsFunction);
it('calls the passed function with the correct arguments', function() { it('calls the passed function with the correct arguments', function() {
var args = tileUrlFunction(new ol.TileCoord(0, 0, 0), var args = tileUrlFunction.call(fakeTileSource,
ol.tilegrid.getForProjection(projection), projection); new ol.TileCoord(0, 0, 0), projection);
expect(args[0]).to.eql('url'); expect(args[0]).to.eql('url');
expect(args[1]).to.be(params); expect(args[1]).to.be(params);
expect(args[2]).to.eql(projection.getExtent()); expect(args[2]).to.eql(projection.getExtent());