diff --git a/examples/wms-custom-proj.js b/examples/wms-custom-proj.js
index 479114e3f5..19d03ca493 100644
--- a/examples/wms-custom-proj.js
+++ b/examples/wms-custom-proj.js
@@ -19,8 +19,10 @@ var epsg21781 = new ol.Projection('EPSG:21781', ol.ProjectionUnits.METERS,
new ol.Extent(485869.5728, 76443.1884, 837076.5648, 299941.7864));
ol.projection.addProjection(epsg21781);
-// We give the single image source a set of resolutions. This prevents the
-// source from requesting images of arbitrary resolutions.
+// We could give the single image source a set of resolutions. This prevents the
+// source from requesting images of arbitrary resolutions. To try it, uncomment
+// the block below and the resolutions option in the SingleImageWMS config.
+/*
var projectionExtent = epsg21781.getExtent();
var maxResolution = Math.max(projectionExtent.getWidth(),
projectionExtent.getHeight()) / 256;
@@ -28,6 +30,7 @@ var resolutions = new Array(10);
for (var i = 0; i < 10; ++i) {
resolutions[i] = maxResolution / Math.pow(2.0, i);
}
+*/
var extent = new ol.Extent(420000, 30000, 900000, 350000);
var layers = new ol.Collection([
@@ -42,20 +45,18 @@ var layers = new ol.Collection([
'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale',
'FORMAT': 'image/jpeg'
},
- projection: epsg21781,
extent: extent
})
}),
new ol.layer.ImageLayer({
source: new ol.source.SingleImageWMS({
+ //resolutions: resolutions,
url: 'http://wms.geo.admin.ch/',
attributions: [new ol.Attribution(
'© ' +
'' +
'National parks / geo.admin.ch')],
- params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
- projection: epsg21781,
- resolutions: resolutions
+ params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}
})
})
]);
diff --git a/src/ol/imageurlfunction.js b/src/ol/imageurlfunction.js
index ca55704f72..4af4b0a5d2 100644
--- a/src/ol/imageurlfunction.js
+++ b/src/ol/imageurlfunction.js
@@ -1,31 +1,28 @@
goog.provide('ol.ImageUrlFunction');
goog.provide('ol.ImageUrlFunctionType');
-goog.require('goog.uri.utils');
goog.require('ol.Extent');
goog.require('ol.Size');
+goog.require('ol.source.wms');
/**
- * @typedef {function(ol.Extent, ol.Size): (string|undefined)}
+ * @typedef {function(ol.Extent, ol.Size, ol.Projection): (string|undefined)}
*/
ol.ImageUrlFunctionType;
/**
* @param {string} baseUrl Base URL (may have query data).
- * @param {string} axisOrientation Axis orientation.
+ * @param {Object.} params WMS parameters.
+ * @param {string=} opt_version WMS version.
* @return {ol.ImageUrlFunctionType} Image URL function.
*/
-ol.ImageUrlFunction.createBboxParam = function(baseUrl, axisOrientation) {
- return function(extent, size) {
- var bboxValues = axisOrientation.substr(0, 2) == 'ne' ?
- [extent.minY, extent.minX, extent.maxY, extent.maxX] :
- [extent.minX, extent.minY, extent.maxX, extent.maxY];
- return goog.uri.utils.appendParams(baseUrl,
- 'BBOX', bboxValues.join(','),
- 'HEIGHT', size.height,
- 'WIDTH', size.width);
+ol.ImageUrlFunction.createWMSParams =
+ function(baseUrl, params, opt_version) {
+ return function(extent, size, projection) {
+ return ol.source.wms.getUrl(
+ baseUrl, params, extent, size, projection, opt_version);
};
};
diff --git a/src/ol/projection.js b/src/ol/projection.js
index 91d00d3fd5..d5a35c08c4 100644
--- a/src/ol/projection.js
+++ b/src/ol/projection.js
@@ -67,6 +67,12 @@ ol.Projection = function(code, units, extent, opt_axisOrientation) {
this.axisOrientation_ = goog.isDef(opt_axisOrientation) ?
opt_axisOrientation : 'enu';
+ /**
+ * @private
+ * @type {ol.tilegrid.TileGrid}
+ */
+ this.defaultTileGrid_ = null;
+
};
@@ -110,6 +116,22 @@ ol.Projection.prototype.getAxisOrientation = function() {
};
+/**
+ * @return {ol.tilegrid.TileGrid} The default tile grid.
+ */
+ol.Projection.prototype.getDefaultTileGrid = function() {
+ return this.defaultTileGrid_;
+};
+
+
+/**
+ * @param {ol.tilegrid.TileGrid} tileGrid The default tile grid.
+ */
+ol.Projection.prototype.setDefaultTileGrid = function(tileGrid) {
+ this.defaultTileGrid_ = tileGrid;
+};
+
+
/**
* @constructor
diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js
index fa62818db7..1465f7f544 100644
--- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js
+++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js
@@ -79,7 +79,8 @@ ol.renderer.canvas.ImageLayer.prototype.renderFrame =
var hints = frameState.viewHints;
if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) {
- image = imageSource.getImage(frameState.extent, viewResolution);
+ image = imageSource.getImage(
+ frameState.extent, viewResolution, view2DState.projection);
if (!goog.isNull(image)) {
var imageState = image.getState();
if (imageState == ol.ImageState.IDLE) {
diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js
index 717e23d879..1374457df6 100644
--- a/src/ol/renderer/canvas/canvastilelayerrenderer.js
+++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js
@@ -91,11 +91,15 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
function(frameState, layerState) {
var view2DState = frameState.view2DState;
+ var projection = view2DState.projection;
var tileLayer = this.getTileLayer();
var tileSource = tileLayer.getTileSource();
var tileSourceKey = goog.getUid(tileSource).toString();
var tileGrid = tileSource.getTileGrid();
+ if (goog.isNull(tileGrid)) {
+ tileGrid = ol.tilegrid.getForProjection(projection);
+ }
var z = tileGrid.getZForResolution(view2DState.resolution);
var tileSize = tileGrid.getTileSize(z);
var tileResolution = tileGrid.getResolution(z);
@@ -135,11 +139,11 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {};
- var isLoaded = function(tile) {
+ var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
- };
+ }, tileSource, tileGrid, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
- tilesToDrawByZ, isLoaded);
+ tilesToDrawByZ, getTileIfLoaded);
var allTilesLoaded = true;
var tile, tileCenter, tileCoord, tileState, x, y;
@@ -147,7 +151,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y);
- tile = tileSource.getTile(tileCoord);
+ tile = tileSource.getTile(tileCoord, tileGrid, projection);
if (goog.isNull(tile)) {
continue;
}
@@ -231,7 +235,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
}
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
- tileSource.useLowResolutionTiles(z, frameState.extent);
+ tileSource.useLowResolutionTiles(z, frameState.extent, tileGrid);
this.scheduleExpireCache(frameState, tileSource);
var transform = this.transform_;
diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js
index 769b944848..4b9ae54332 100644
--- a/src/ol/renderer/dom/domimagelayerrenderer.js
+++ b/src/ol/renderer/dom/domimagelayerrenderer.js
@@ -67,7 +67,8 @@ ol.renderer.dom.ImageLayer.prototype.renderFrame =
var hints = frameState.viewHints;
if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) {
- var image_ = imageSource.getImage(frameState.extent, viewResolution);
+ var image_ = imageSource.getImage(
+ frameState.extent, viewResolution, view2DState.projection);
if (!goog.isNull(image_)) {
var imageState = image_.getState();
if (imageState == ol.ImageState.IDLE) {
diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js
index 22cfd29744..afe7463db1 100644
--- a/src/ol/renderer/dom/domtilelayerrenderer.js
+++ b/src/ol/renderer/dom/domtilelayerrenderer.js
@@ -79,11 +79,15 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
}
var view2DState = frameState.view2DState;
+ var projection = view2DState.projection;
var tileLayer = this.getTileLayer();
var tileSource = tileLayer.getTileSource();
var tileSourceKey = goog.getUid(tileSource).toString();
var tileGrid = tileSource.getTileGrid();
+ if (goog.isNull(tileGrid)) {
+ tileGrid = ol.tilegrid.getForProjection(projection);
+ }
var z = tileGrid.getZForResolution(view2DState.resolution);
var tileResolution = tileGrid.getResolution(z);
var tileRange = tileGrid.getTileRangeForExtentAndResolution(
@@ -93,11 +97,11 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {};
- var isLoaded = function(tile) {
+ var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
- };
+ }, tileSource, tileGrid, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
- tilesToDrawByZ, isLoaded);
+ tilesToDrawByZ, getTileIfLoaded);
var allTilesLoaded = true;
var tile, tileCenter, tileCoord, tileState, x, y;
@@ -105,7 +109,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y);
- tile = tileSource.getTile(tileCoord);
+ tile = tileSource.getTile(tileCoord, tileGrid, projection);
if (goog.isNull(tile)) {
continue;
}
@@ -216,7 +220,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
}
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
- tileSource.useLowResolutionTiles(z, frameState.extent);
+ tileSource.useLowResolutionTiles(z, frameState.extent, tileGrid);
this.scheduleExpireCache(frameState, tileSource);
};
diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js
index f1477ac8d7..6a6f1d4aff 100644
--- a/src/ol/renderer/layerrenderer.js
+++ b/src/ol/renderer/layerrenderer.js
@@ -258,3 +258,20 @@ ol.renderer.Layer.prototype.updateWantedTiles =
}
wantedTiles[tileSourceKey][coordKey] = true;
};
+
+
+/**
+ * @param {function(ol.Tile): boolean} isLoadedFunction Function to
+ * determine if the tile is loaded.
+ * @param {ol.source.TileSource} tileSource Tile source.
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
+ * @param {ol.Projection} projection Projection.
+ * @return {function(ol.TileCoord): ol.Tile} Returns a tile if it is loaded.
+ */
+ol.renderer.Layer.prototype.createGetTileIfLoadedFunction =
+ function(isLoadedFunction, tileSource, tileGrid, projection) {
+ return function(tileCoord) {
+ var tile = tileSource.getTile(tileCoord, tileGrid, projection);
+ return isLoadedFunction(tile) ? tile : null;
+ };
+};
diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js
index b0edbca02c..46d2246c85 100644
--- a/src/ol/renderer/webgl/webglimagelayerrenderer.js
+++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js
@@ -160,7 +160,8 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame =
var hints = frameState.viewHints;
if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) {
- var image_ = imageSource.getImage(frameState.extent, viewResolution);
+ var image_ = imageSource.getImage(
+ frameState.extent, viewResolution, view2DState.projection);
if (!goog.isNull(image_)) {
var imageState = image_.getState();
if (imageState == ol.ImageState.IDLE) {
diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js
index 39d736c435..4059509e0a 100644
--- a/src/ol/renderer/webgl/webgltilelayerrenderer.js
+++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js
@@ -281,12 +281,16 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
var gl = mapRenderer.getGL();
var view2DState = frameState.view2DState;
+ var projection = view2DState.projection;
var center = view2DState.center;
var tileLayer = this.getTileLayer();
var tileSource = tileLayer.getTileSource();
var tileSourceKey = goog.getUid(tileSource).toString();
var tileGrid = tileSource.getTileGrid();
+ if (goog.isNull(tileGrid)) {
+ tileGrid = ol.tilegrid.getForProjection(projection);
+ }
var z = tileGrid.getZForResolution(view2DState.resolution);
var tileResolution = tileGrid.getResolution(z);
var tileRange = tileGrid.getTileRangeForExtentAndResolution(
@@ -365,12 +369,12 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {};
- var isLoaded = function(tile) {
+ var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED &&
mapRenderer.isTileTextureLoaded(tile);
- };
+ }, tileSource, tileGrid, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
- tilesToDrawByZ, isLoaded);
+ tilesToDrawByZ, getTileIfLoaded);
var tilesToLoad = new goog.structs.PriorityQueue();
@@ -380,7 +384,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y);
- tile = tileSource.getTile(tileCoord);
+ tile = tileSource.getTile(tileCoord, tileGrid, projection);
if (goog.isNull(tile)) {
continue;
}
@@ -459,7 +463,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
}
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
- tileSource.useLowResolutionTiles(z, frameState.extent);
+ tileSource.useLowResolutionTiles(z, frameState.extent, tileGrid);
this.scheduleExpireCache(frameState, tileSource);
goog.vec.Mat4.makeIdentity(this.texCoordMatrix_);
diff --git a/src/ol/source/imagesource.js b/src/ol/source/imagesource.js
index 879a007d5c..70c980afb2 100644
--- a/src/ol/source/imagesource.js
+++ b/src/ol/source/imagesource.js
@@ -76,12 +76,13 @@ goog.inherits(ol.source.ImageSource, ol.source.Source);
* @param {ol.Extent} extent Extent.
* @param {number} resolution Resolution.
* @param {ol.Size} size Size.
+ * @param {ol.Projection} projection Projection.
* @return {ol.Image} Single image.
*/
ol.source.ImageSource.prototype.createImage =
- function(extent, resolution, size) {
+ function(extent, resolution, size, projection) {
var image = null;
- var imageUrl = this.imageUrlFunction(extent, size);
+ var imageUrl = this.imageUrlFunction(extent, size, projection);
if (goog.isDef(imageUrl)) {
image = new ol.Image(
extent, resolution, imageUrl, this.crossOrigin_,
@@ -109,6 +110,7 @@ ol.source.ImageSource.prototype.findNearestResolution =
/**
* @param {ol.Extent} extent Extent.
* @param {number} resolution Resolution.
+ * @param {ol.Projection} projection Projection.
* @return {ol.Image} Single image.
*/
ol.source.ImageSource.prototype.getImage = goog.abstractMethod;
diff --git a/src/ol/source/imagetilesource.js b/src/ol/source/imagetilesource.js
index b29849a4a6..b9fd30f9ea 100644
--- a/src/ol/source/imagetilesource.js
+++ b/src/ol/source/imagetilesource.js
@@ -7,7 +7,6 @@ goog.require('ol.ImageTile');
goog.require('ol.Projection');
goog.require('ol.Tile');
goog.require('ol.TileCache');
-goog.require('ol.TileCoord');
goog.require('ol.TileUrlFunction');
goog.require('ol.TileUrlFunctionType');
goog.require('ol.source.TileSource');
@@ -86,12 +85,15 @@ ol.source.ImageTileSource.prototype.expireCache = function(usedTiles) {
/**
* @inheritDoc
*/
-ol.source.ImageTileSource.prototype.getTile = function(tileCoord) {
+ol.source.ImageTileSource.prototype.getTile =
+ function(tileCoord, tileGrid, projection) {
var key = tileCoord.toString();
if (this.tileCache_.containsKey(key)) {
return /** @type {ol.Tile} */ (this.tileCache_.get(key));
} else {
- var tileUrl = this.getTileCoordUrl(tileCoord);
+ goog.asserts.assert(tileGrid);
+ goog.asserts.assert(projection);
+ var tileUrl = this.tileUrlFunction(tileCoord, tileGrid, projection);
var tile;
if (goog.isDef(tileUrl)) {
tile = new ol.ImageTile(tileCoord, tileUrl, this.crossOrigin_);
@@ -104,15 +106,6 @@ ol.source.ImageTileSource.prototype.getTile = function(tileCoord) {
};
-/**
- * @param {ol.TileCoord} tileCoord Tile coordinate.
- * @return {string|undefined} Tile URL.
- */
-ol.source.ImageTileSource.prototype.getTileCoordUrl = function(tileCoord) {
- return this.tileUrlFunction(tileCoord);
-};
-
-
/**
* @inheritDoc
*/
diff --git a/src/ol/source/singleimagewmssource.js b/src/ol/source/singleimagewmssource.js
index ac369e1079..0a8ea8d66c 100644
--- a/src/ol/source/singleimagewmssource.js
+++ b/src/ol/source/singleimagewmssource.js
@@ -1,11 +1,9 @@
goog.provide('ol.source.SingleImageWMS');
-goog.require('goog.uri.utils');
goog.require('ol.Extent');
goog.require('ol.Image');
goog.require('ol.ImageUrlFunction');
goog.require('ol.Size');
-goog.require('ol.projection');
goog.require('ol.source.ImageSource');
@@ -16,45 +14,16 @@ goog.require('ol.source.ImageSource');
* @param {ol.source.SingleImageWMSOptions} options Options.
*/
ol.source.SingleImageWMS = function(options) {
-
- var projection = ol.projection.createProjection(
- options.projection, 'EPSG:3857');
- var projectionExtent = projection.getExtent();
-
- var extent = goog.isDef(options.extent) ?
- options.extent : projectionExtent;
-
- var version = goog.isDef(options.version) ?
- options.version : '1.3';
-
- var baseParams = {
- 'SERVICE': 'WMS',
- 'VERSION': version,
- 'REQUEST': 'GetMap',
- 'STYLES': '',
- 'FORMAT': 'image/png',
- 'TRANSPARENT': true
- };
- baseParams[version >= '1.3' ? 'CRS' : 'SRS'] = projection.getCode();
- goog.object.extend(baseParams, options.params);
-
- var axisOrientation = projection.getAxisOrientation();
- var imageUrlFunction;
- if (options.url) {
- var url = goog.uri.utils.appendParamsFromMap(
- options.url, baseParams);
- imageUrlFunction =
- ol.ImageUrlFunction.createBboxParam(url, axisOrientation);
- } else {
- imageUrlFunction =
- ol.ImageUrlFunction.nullImageUrlFunction;
- }
+ var imageUrlFunction = goog.isDef(options.url) ?
+ ol.ImageUrlFunction.createWMSParams(
+ options.url, options.params, options.version) :
+ ol.ImageUrlFunction.nullImageUrlFunction;
goog.base(this, {
attributions: options.attributions,
crossOrigin: options.crossOrigin,
- extent: extent,
- projection: projection,
+ extent: options.extent,
+ projection: options.projection,
resolutions: options.resolutions,
imageUrlFunction: imageUrlFunction
});
@@ -80,7 +49,7 @@ goog.inherits(ol.source.SingleImageWMS, ol.source.ImageSource);
* @inheritDoc
*/
ol.source.SingleImageWMS.prototype.getImage =
- function(extent, resolution) {
+ function(extent, resolution, projection) {
resolution = this.findNearestResolution(resolution);
var image = this.image_;
@@ -97,6 +66,6 @@ ol.source.SingleImageWMS.prototype.getImage =
var height = extent.getHeight() / resolution;
var size = new ol.Size(width, height);
- this.image_ = this.createImage(extent, resolution, size);
+ this.image_ = this.createImage(extent, resolution, size, projection);
return this.image_;
};
diff --git a/src/ol/source/source.js b/src/ol/source/source.js
index c56ec4d257..2bc657b57c 100644
--- a/src/ol/source/source.js
+++ b/src/ol/source/source.js
@@ -38,7 +38,8 @@ ol.source.Source = function(sourceOptions) {
* @type {ol.Extent}
*/
this.extent_ = goog.isDef(sourceOptions.extent) ?
- sourceOptions.extent : sourceOptions.projection.getExtent();
+ sourceOptions.extent : goog.isDef(sourceOptions.projection) ?
+ sourceOptions.projection.getExtent() : null;
/**
* @private
diff --git a/src/ol/source/staticimagesource.js b/src/ol/source/staticimagesource.js
index eafa205eb1..b1d15bcbe0 100644
--- a/src/ol/source/staticimagesource.js
+++ b/src/ol/source/staticimagesource.js
@@ -19,6 +19,7 @@ ol.source.StaticImage = function(options) {
var imageExtent = options.imageExtent;
var imageSize = options.imageSize;
var imageResolution = imageExtent.getHeight() / imageSize.height;
+ var projection = goog.isDef(options.projection) ? options.projection : null;
goog.base(this, {
attributions: options.attributions,
@@ -33,7 +34,8 @@ ol.source.StaticImage = function(options) {
* @private
* @type {ol.Image}
*/
- this.image_ = this.createImage(imageExtent, imageResolution, imageSize);
+ this.image_ = this.createImage(
+ imageExtent, imageResolution, imageSize, projection);
};
goog.inherits(ol.source.StaticImage, ol.source.ImageSource);
@@ -42,7 +44,8 @@ goog.inherits(ol.source.StaticImage, ol.source.ImageSource);
/**
* @inheritDoc
*/
-ol.source.StaticImage.prototype.getImage = function(extent, resolution) {
+ol.source.StaticImage.prototype.getImage =
+ function(extent, resolution, projection) {
if (extent.intersects(this.image_.getExtent())) {
return this.image_;
}
@@ -55,7 +58,7 @@ ol.source.StaticImage.prototype.getImage = function(extent, resolution) {
* @return {ol.ImageUrlFunctionType} Function.
*/
ol.source.StaticImage.createImageFunction = function(url) {
- return function(extent, size) {
+ return function(extent, size, projection) {
return url;
};
};
diff --git a/src/ol/source/tiledwmssource.js b/src/ol/source/tiledwmssource.js
index 998cff4b43..7ba0401cdd 100644
--- a/src/ol/source/tiledwmssource.js
+++ b/src/ol/source/tiledwmssource.js
@@ -4,12 +4,9 @@ goog.provide('ol.source.TiledWMS');
goog.require('goog.array');
-goog.require('goog.object');
-goog.require('goog.uri.utils');
goog.require('ol.Extent');
goog.require('ol.TileCoord');
goog.require('ol.TileUrlFunction');
-goog.require('ol.projection');
goog.require('ol.source.ImageTileSource');
@@ -20,67 +17,41 @@ goog.require('ol.source.ImageTileSource');
* @param {ol.source.TiledWMSOptions} tiledWMSOptions options.
*/
ol.source.TiledWMS = function(tiledWMSOptions) {
- var projection = ol.projection.createProjection(
- tiledWMSOptions.projection, 'EPSG:3857');
- var projectionExtent = projection.getExtent();
-
- var extent = goog.isDef(tiledWMSOptions.extent) ?
- tiledWMSOptions.extent : projectionExtent;
-
- var transparent = goog.isDef(tiledWMSOptions.transparent) ?
- tiledWMSOptions.transparent : true;
-
- var version = goog.isDef(tiledWMSOptions.version) ?
- tiledWMSOptions.version : '1.3';
-
var tileGrid;
if (goog.isDef(tiledWMSOptions.tileGrid)) {
tileGrid = tiledWMSOptions.tileGrid;
- } else {
- tileGrid = ol.tilegrid.createForProjection(projection,
- tiledWMSOptions.maxZoom);
}
+ var version = tiledWMSOptions.version;
- var baseParams = {
- 'SERVICE': 'WMS',
- 'VERSION': version,
- 'REQUEST': 'GetMap',
- 'STYLES': '',
- 'FORMAT': 'image/png',
- 'TRANSPARENT': transparent
- };
- baseParams[version >= '1.3' ? 'CRS' : 'SRS'] = projection.getCode();
- goog.object.extend(baseParams, tiledWMSOptions.params);
-
- var axisOrientation = projection.getAxisOrientation();
var tileUrlFunction;
if (tiledWMSOptions.urls) {
var tileUrlFunctions = goog.array.map(
tiledWMSOptions.urls, function(url) {
- url = goog.uri.utils.appendParamsFromMap(url, baseParams);
- return ol.TileUrlFunction.createBboxParam(
- url, tileGrid, axisOrientation);
+ return ol.TileUrlFunction.createWMSParams(
+ url, tiledWMSOptions.params, version);
});
tileUrlFunction = ol.TileUrlFunction.createFromTileUrlFunctions(
tileUrlFunctions);
} else if (tiledWMSOptions.url) {
- var url = goog.uri.utils.appendParamsFromMap(
- tiledWMSOptions.url, baseParams);
- tileUrlFunction =
- ol.TileUrlFunction.createBboxParam(url, tileGrid, axisOrientation);
+ tileUrlFunction = ol.TileUrlFunction.createWMSParams(
+ tiledWMSOptions.url, tiledWMSOptions.params, version);
} else {
tileUrlFunction = ol.TileUrlFunction.nullTileUrlFunction;
}
+ var transparent = goog.isDef(tiledWMSOptions.transparent) ?
+ tiledWMSOptions.transparent : true;
+ var extent = tiledWMSOptions.extent;
- var tileCoordTransform = function(tileCoord) {
+ var tileCoordTransform = function(tileCoord, tileGrid, projection) {
if (tileGrid.getResolutions().length <= tileCoord.z) {
return null;
}
var x = tileCoord.x;
var tileExtent = tileGrid.getTileCoordExtent(tileCoord);
+ var projectionExtent = projection.getExtent();
// FIXME do we want a wrapDateLine param? The code below will break maps
// with projections that do not span the whole world width.
- if (extent.minX === projectionExtent.minX &&
+ if (extent && extent.minX === projectionExtent.minX &&
extent.maxX === projectionExtent.maxX) {
var numCols = Math.ceil(
(extent.maxX - extent.minX) / (tileExtent.maxX - tileExtent.minX));
@@ -99,9 +70,9 @@ ol.source.TiledWMS = function(tiledWMSOptions) {
attributions: tiledWMSOptions.attributions,
crossOrigin: tiledWMSOptions.crossOrigin,
extent: extent,
- tileGrid: tileGrid,
+ tileGrid: tiledWMSOptions.tileGrid,
opaque: !transparent,
- projection: projection,
+ projection: tiledWMSOptions.projection,
tileUrlFunction: ol.TileUrlFunction.withTileCoordTransform(
tileCoordTransform, tileUrlFunction)
});
diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js
index cb3a5a5133..92bd61caf3 100644
--- a/src/ol/source/tilesource.js
+++ b/src/ol/source/tilesource.js
@@ -73,14 +73,14 @@ ol.source.TileSource.prototype.expireCache = goog.abstractMethod;
*
* @param {Object.>} loadedTilesByZ A lookup of
* loaded tiles by zoom level.
- * @param {function(ol.Tile): boolean} isLoaded A function to determine if a
- * tile is fully loaded.
+ * @param {function(ol.TileCoord): ol.Tile} getTileIfLoaded A function that
+ * returns the tile only if it is fully loaded.
* @param {number} z Zoom level.
* @param {ol.TileRange} tileRange Tile range.
* @return {boolean} The tile range is fully covered with loaded tiles.
*/
ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ,
- isLoaded, z, tileRange) {
+ getTileIfLoaded, z, tileRange) {
// FIXME this could be more efficient about filling partial holes
var fullyCovered = true;
var tile, tileCoord, tileCoordKey, x, y;
@@ -91,8 +91,8 @@ ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ,
if (loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) {
continue;
}
- tile = this.getTile(tileCoord);
- if (isLoaded(tile)) {
+ tile = getTileIfLoaded(tileCoord);
+ if (!goog.isNull(tile)) {
if (!loadedTilesByZ[z]) {
loadedTilesByZ[z] = {};
}
@@ -124,6 +124,8 @@ ol.source.TileSource.prototype.getResolutions = function() {
/**
* @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.tilegrid.TileGrid=} opt_tileGrid Tile grid.
+ * @param {ol.Projection=} opt_projection Projection.
* @return {ol.Tile} Tile.
*/
ol.source.TileSource.prototype.getTile = goog.abstractMethod;
@@ -140,9 +142,10 @@ ol.source.TileSource.prototype.getTileGrid = function() {
/**
* @param {number} z Z.
* @param {ol.Extent} extent Extent.
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
*/
-ol.source.TileSource.prototype.useLowResolutionTiles = function(z, extent) {
- var tileGrid = this.getTileGrid();
+ol.source.TileSource.prototype.useLowResolutionTiles =
+ function(z, extent, tileGrid) {
var tileRange, x, y, zKey;
// FIXME this should loop up to tileGrid's minZ when implemented
for (; z >= 0; --z) {
diff --git a/src/ol/source/wms.js b/src/ol/source/wms.js
new file mode 100644
index 0000000000..0fff2f8e25
--- /dev/null
+++ b/src/ol/source/wms.js
@@ -0,0 +1,37 @@
+goog.provide('ol.source.wms');
+
+
+/**
+ * @param {string} baseUrl WMS base url.
+ * @param {Object.} params Request parameters.
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Size.
+ * @param {ol.Projection} projection Projection.
+ * @param {string=} opt_version WMS version. Default is '1.3.0'.
+ * @return {string} WMS GetMap request URL.
+ */
+ol.source.wms.getUrl =
+ function(baseUrl, params, extent, size, projection, opt_version) {
+ var version = goog.isDef(opt_version) ? opt_version : '1.3.0';
+ var wms13 = version >= '1.3';
+ var axisOrientation = projection.getAxisOrientation();
+ var bboxValues = (wms13 && axisOrientation.substr(0, 2) == 'ne') ?
+ [extent.minY, extent.minX, extent.maxY, extent.maxX] :
+ [extent.minX, extent.minY, extent.maxX, extent.maxY];
+ var baseParams = {
+ 'SERVICE': 'WMS',
+ 'VERSION': version,
+ 'REQUEST': 'GetMap',
+ 'FORMAT': 'image/png',
+ 'TRANSPARENT': true,
+ 'WIDTH': size.width,
+ 'HEIGHT': size.height,
+ 'BBOX': bboxValues.join(',')
+ };
+ goog.object.extend(baseParams, params);
+ baseParams[wms13 ? 'CRS' : 'SRS'] = projection.getCode();
+ //TODO: Provide our own appendParams function to avoid this empty string hack
+ var stylesParam = 'STYLES';
+ baseParams[stylesParam] = params[stylesParam] || new String('');
+ return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams);
+};
diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js
index 415557d93e..bcbbe26bd6 100644
--- a/src/ol/tilegrid/tilegrid.js
+++ b/src/ol/tilegrid/tilegrid.js
@@ -20,6 +20,12 @@ goog.require('ol.array');
ol.DEFAULT_TILE_SIZE = 256;
+/**
+ * @define {number} Default maximum zoom for default tile grids.
+ */
+ol.DEFAULT_MAX_ZOOM = 42;
+
+
/**
* @constructor
@@ -89,8 +95,7 @@ ol.tilegrid.TileGrid = function(tileGridOptions) {
/**
* @param {ol.TileCoord} tileCoord Tile coordinate.
- * @param {function(this: T, number, ol.TileRange): boolean} callback
- * Callback.
+ * @param {function(this: T, number, ol.TileRange): boolean} callback Callback.
* @param {T=} opt_obj Object.
* @template T
*/
@@ -328,7 +333,21 @@ ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) {
/**
* @param {ol.Projection} projection Projection.
- * @param {number=} opt_maxZoom Maximum zoom level (optional). Default is 18.
+ * @return {ol.tilegrid.TileGrid} Default tile grid for the passed projection.
+ */
+ol.tilegrid.getForProjection = function(projection) {
+ var tileGrid = projection.getDefaultTileGrid();
+ if (goog.isNull(tileGrid)) {
+ tileGrid = ol.tilegrid.createForProjection(projection);
+ projection.setDefaultTileGrid(tileGrid);
+ }
+ return tileGrid;
+};
+
+
+/**
+ * @param {ol.Projection} projection Projection.
+ * @param {number=} opt_maxZoom Maximum zoom level.
* @param {ol.Size=} opt_tileSize Tile size.
* @return {ol.tilegrid.TileGrid} TileGrid instance.
*/
@@ -339,7 +358,7 @@ ol.tilegrid.createForProjection =
projectionExtent.maxX - projectionExtent.minX,
projectionExtent.maxY - projectionExtent.minY);
var maxZoom = goog.isDef(opt_maxZoom) ?
- opt_maxZoom : 18;
+ opt_maxZoom : ol.DEFAULT_MAX_ZOOM;
var tileSize = goog.isDef(opt_tileSize) ?
opt_tileSize : new ol.Size(ol.DEFAULT_TILE_SIZE, ol.DEFAULT_TILE_SIZE);
var resolutions = new Array(maxZoom + 1);
diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js
index d64c57ec9e..4e09acc976 100644
--- a/src/ol/tileurlfunction.js
+++ b/src/ol/tileurlfunction.js
@@ -3,13 +3,14 @@ goog.provide('ol.TileUrlFunctionType');
goog.require('goog.array');
goog.require('goog.math');
-goog.require('goog.uri.utils');
goog.require('ol.TileCoord');
+goog.require('ol.source.wms');
goog.require('ol.tilegrid.TileGrid');
/**
- * @typedef {function(ol.TileCoord): (string|undefined)}
+ * @typedef {function(ol.TileCoord, ol.tilegrid.TileGrid, ol.Projection):
+ * (string|undefined)}
*/
ol.TileUrlFunctionType;
@@ -59,12 +60,12 @@ ol.TileUrlFunction.createFromTemplates = function(templates) {
* @return {ol.TileUrlFunctionType} Tile URL function.
*/
ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) {
- return function(tileCoord) {
+ return function(tileCoord, tileGrid, projection) {
if (goog.isNull(tileCoord)) {
return undefined;
} else {
var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length);
- return tileUrlFunctions[index](tileCoord);
+ return tileUrlFunctions[index](tileCoord, tileGrid, projection);
}
};
};
@@ -72,25 +73,20 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) {
/**
* @param {string} baseUrl Base URL (may have query data).
- * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
- * @param {string} axisOrientation Axis orientation.
+ * @param {Object.} params WMS parameters.
+ * @param {string=} opt_version WMS version.
* @return {ol.TileUrlFunctionType} Tile URL function.
*/
-ol.TileUrlFunction.createBboxParam =
- function(baseUrl, tileGrid, axisOrientation) {
- return function(tileCoord) {
+ol.TileUrlFunction.createWMSParams =
+ function(baseUrl, params, opt_version) {
+ return function(tileCoord, tileGrid, projection) {
if (goog.isNull(tileCoord)) {
return undefined;
} else {
- var tileExtent = tileGrid.getTileCoordExtent(tileCoord);
- var bboxValues = axisOrientation.substr(0, 2) == 'ne' ?
- [tileExtent.minY, tileExtent.minX, tileExtent.maxY, tileExtent.maxX] :
- [tileExtent.minX, tileExtent.minY, tileExtent.maxX, tileExtent.maxY];
- var tileSize = tileGrid.getTileSize(tileCoord.z);
- return goog.uri.utils.appendParams(baseUrl,
- 'BBOX', bboxValues.join(','),
- 'HEIGHT', tileSize.height,
- 'WIDTH', tileSize.width);
+ var size = tileGrid.getTileSize(tileCoord.z);
+ var extent = tileGrid.getTileCoordExtent(tileCoord);
+ return ol.source.wms.getUrl(
+ baseUrl, params, extent, size, projection, opt_version);
}
};
};
@@ -106,18 +102,19 @@ ol.TileUrlFunction.nullTileUrlFunction = function(tileCoord) {
/**
- * @param {function(ol.TileCoord): ol.TileCoord} transformFn
- * Transform.function.
+ * @param {function(ol.TileCoord, ol.tilegrid.TileGrid, ol.Projection):
+ * ol.TileCoord} transformFn Transform.function.
* @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function.
* @return {ol.TileUrlFunctionType} Tile URL function.
*/
ol.TileUrlFunction.withTileCoordTransform =
function(transformFn, tileUrlFunction) {
- return function(tileCoord) {
+ return function(tileCoord, tileGrid, projection) {
if (goog.isNull(tileCoord)) {
return undefined;
} else {
- return tileUrlFunction(transformFn(tileCoord));
+ return tileUrlFunction(
+ transformFn(tileCoord, tileGrid, projection), tileGrid, projection);
}
};
};
diff --git a/test/spec/ol/source/tilesource.test.js b/test/spec/ol/source/tilesource.test.js
index 53f2dd05bb..a03229a8fd 100644
--- a/test/spec/ol/source/tilesource.test.js
+++ b/test/spec/ol/source/tilesource.test.js
@@ -14,10 +14,6 @@ describe('ol.source.TileSource', function() {
describe('#findLoadedTiles()', function() {
- function isLoaded(tile) {
- return !goog.isNull(tile) && tile.getState() === ol.TileState.LOADED;
- }
-
it('adds no tiles if none are already loaded', function() {
// a source with no loaded tiles
var source = new ol.test.source.MockTileSource({});
@@ -25,7 +21,13 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 3);
- source.findLoadedTiles(loadedTilesByZ, isLoaded, 3, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 3, range);
var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(0);
@@ -41,7 +43,13 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 0);
- source.findLoadedTiles(loadedTilesByZ, isLoaded, 0, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 0, range);
var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(1);
var tile = loadedTilesByZ['0']['0/0/0'];
@@ -59,7 +67,13 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
- source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 1, range);
var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(1);
var tile = loadedTilesByZ['1']['1/0/0'];
@@ -79,7 +93,13 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
- var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ var loaded = source.findLoadedTiles(
+ loadedTilesByZ, getTileIfLoaded, 1, range);
expect(loaded).toBe(true);
});
@@ -98,7 +118,14 @@ describe('ol.source.TileSource', function() {
};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
- var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ var loaded = source.findLoadedTiles(
+ loadedTilesByZ, getTileIfLoaded, 1, range);
expect(loaded).toBe(true);
});
@@ -114,7 +141,14 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
- var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ var loaded = source.findLoadedTiles(
+ loadedTilesByZ, getTileIfLoaded, 1, range);
expect(loaded).toBe(false);
});
@@ -132,7 +166,14 @@ describe('ol.source.TileSource', function() {
};
var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
- var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
+
+ function getTileIfLoaded(tileCoord) {
+ var tile = source.getTile(tileCoord, null, null);
+ return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+ tile : null;
+ }
+ var loaded = source.findLoadedTiles(
+ loadedTilesByZ, getTileIfLoaded, 1, range);
expect(loaded).toBe(false);
});
diff --git a/test/spec/ol/source/xyz.test.js b/test/spec/ol/source/xyz.test.js
index bf968d4c86..e53ad17f86 100644
--- a/test/spec/ol/source/xyz.test.js
+++ b/test/spec/ol/source/xyz.test.js
@@ -2,7 +2,7 @@ goog.provide('ol.test.source.XYZ');
describe('ol.source.XYZ', function() {
- describe('getTileCoordUrl', function() {
+ describe('tileUrlFunction', function() {
var xyzTileSource, tileGrid;
@@ -18,59 +18,59 @@ describe('ol.source.XYZ', function() {
var coordinate = new ol.Coordinate(829330.2064098881, 5933916.615134273);
var tileUrl;
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 0));
expect(tileUrl).toEqual('0/0/0');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 1));
expect(tileUrl).toEqual('1/1/0');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 2));
expect(tileUrl).toEqual('2/2/1');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 3));
expect(tileUrl).toEqual('3/4/2');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 4));
expect(tileUrl).toEqual('4/8/5');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 5));
expect(tileUrl).toEqual('5/16/11');
- tileUrl = xyzTileSource.getTileCoordUrl(
+ tileUrl = xyzTileSource.tileUrlFunction(
tileGrid.getTileCoordForCoordAndZ(coordinate, 6));
expect(tileUrl).toEqual('6/33/22');
});
describe('wrap x', function() {
it('returns the expected URL', function() {
- var tileUrl = xyzTileSource.getTileCoordUrl(
+ var tileUrl = xyzTileSource.tileUrlFunction(
new ol.TileCoord(6, -31, -23));
expect(tileUrl).toEqual('6/33/22');
- tileUrl = xyzTileSource.getTileCoordUrl(new ol.TileCoord(6, 33, -23));
+ tileUrl = xyzTileSource.tileUrlFunction(new ol.TileCoord(6, 33, -23));
expect(tileUrl).toEqual('6/33/22');
- tileUrl = xyzTileSource.getTileCoordUrl(new ol.TileCoord(6, 97, -23));
+ tileUrl = xyzTileSource.tileUrlFunction(new ol.TileCoord(6, 97, -23));
expect(tileUrl).toEqual('6/33/22');
});
});
describe('crop y', function() {
it('returns the expected URL', function() {
- var tileUrl = xyzTileSource.getTileCoordUrl(
+ var tileUrl = xyzTileSource.tileUrlFunction(
new ol.TileCoord(6, 33, -87));
expect(tileUrl).toBeUndefined();
- tileUrl = xyzTileSource.getTileCoordUrl(new ol.TileCoord(6, 33, -23));
+ tileUrl = xyzTileSource.tileUrlFunction(new ol.TileCoord(6, 33, -23));
expect(tileUrl).toEqual('6/33/22');
- tileUrl = xyzTileSource.getTileCoordUrl(new ol.TileCoord(6, 33, 41));
+ tileUrl = xyzTileSource.tileUrlFunction(new ol.TileCoord(6, 33, 41));
expect(tileUrl).toBeUndefined();
});
});
diff --git a/test/spec/ol/tilegrid.test.js b/test/spec/ol/tilegrid.test.js
index 3c24a17167..5c254dd47f 100644
--- a/test/spec/ol/tilegrid.test.js
+++ b/test/spec/ol/tilegrid.test.js
@@ -169,16 +169,16 @@ describe('ol.tilegrid.TileGrid', function() {
expect(grid).toBeA(ol.tilegrid.TileGrid);
var resolutions = grid.getResolutions();
- expect(resolutions.length).toBe(19);
+ expect(resolutions.length).toBe(ol.DEFAULT_MAX_ZOOM + 1);
});
it('accepts a number of zoom levels', function() {
var projection = ol.projection.getFromCode('EPSG:3857');
- var grid = ol.tilegrid.createForProjection(projection, 22);
+ var grid = ol.tilegrid.createForProjection(projection, 18);
expect(grid).toBeA(ol.tilegrid.TileGrid);
var resolutions = grid.getResolutions();
- expect(resolutions.length).toBe(23);
+ expect(resolutions.length).toBe(19);
});
it('accepts a big number of zoom levels', function() {
@@ -192,6 +192,28 @@ describe('ol.tilegrid.TileGrid', function() {
});
+ describe('getForProjection', function() {
+
+ it('gets the default tile grid for a projection', function() {
+ var projection = ol.projection.getFromCode('EPSG:3857');
+ var grid = ol.tilegrid.getForProjection(projection);
+ expect(grid).toBeA(ol.tilegrid.TileGrid);
+
+ var resolutions = grid.getResolutions();
+ expect(resolutions.length).toBe(ol.DEFAULT_MAX_ZOOM + 1);
+ expect(grid.getTileSize().toString()).toBe('(256 x 256)');
+ });
+
+ it('stores the default tile grid on a projection', function() {
+ var projection = ol.projection.getFromCode('EPSG:3857');
+ var grid = ol.tilegrid.getForProjection(projection);
+ var gridAgain = ol.tilegrid.getForProjection(projection);
+
+ expect(grid).toBe(gridAgain);
+ });
+
+ });
+
describe('getTileCoordFromCoordAndZ', function() {
describe('Y North, X East', function() {
diff --git a/test/spec/ol/tileurlfunction.test.js b/test/spec/ol/tileurlfunction.test.js
index b3fd9caad8..d411ed4e24 100644
--- a/test/spec/ol/tileurlfunction.test.js
+++ b/test/spec/ol/tileurlfunction.test.js
@@ -61,7 +61,7 @@ describe('ol.TileUrlFunction', function() {
});
});
- describe('createBboxParam', function() {
+ describe('createWMSParams', function() {
var tileGrid;
beforeEach(function() {
tileGrid = new ol.tilegrid.XYZ({
@@ -70,24 +70,26 @@ describe('ol.TileUrlFunction', function() {
});
it('creates expected URL', function() {
var epsg3857 = ol.projection.getFromCode('EPSG:3857');
- var tileUrlFunction = ol.TileUrlFunction.createBboxParam(
- 'http://wms?foo=bar', tileGrid, epsg3857.getAxisOrientation());
+ var tileUrlFunction = ol.TileUrlFunction.createWMSParams(
+ 'http://wms?foo=bar', {});
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' +
- '&HEIGHT=256&WIDTH=256';
+ var tileUrl = tileUrlFunction(tileCoord, tileGrid, epsg3857);
+ var expected = 'http://wms?foo=bar&SERVICE=WMS&VERSION=1.3.0&' +
+ 'REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&' +
+ 'HEIGHT=256&BBOX=-20037508.342789244%2C20037508.342789244%2C0%2C' +
+ '40075016.68557849&CRS=EPSG%3A3857&STYLES=';
expect(tileUrl).toEqual(expected);
});
it('creates expected URL respecting axis orientation', function() {
var epsg4326 = ol.projection.getFromCode('EPSG:4326');
- var tileUrlFunction = ol.TileUrlFunction.createBboxParam(
- 'http://wms?foo=bar', tileGrid, epsg4326.getAxisOrientation());
+ var tileUrlFunction = ol.TileUrlFunction.createWMSParams(
+ 'http://wms?foo=bar', {});
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' +
- '&HEIGHT=256&WIDTH=256';
+ var tileUrl = tileUrlFunction(tileCoord, tileGrid, epsg4326);
+ var expected = 'http://wms?foo=bar&SERVICE=WMS&VERSION=1.3.0&' +
+ 'REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&WIDTH=256&' +
+ 'HEIGHT=256&BBOX=20037508.342789244%2C-20037508.342789244%2C' +
+ '40075016.68557849%2C0&CRS=EPSG%3A4326&STYLES=';
expect(tileUrl).toEqual(expected);
});
});