From a4a8d01bac023eb219bad2a38469a680ff59ede5 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Thu, 9 Feb 2017 11:44:57 +0100 Subject: [PATCH] Use an url template for ol.source.Zoomify --- changelog/upgrade-notes.md | 26 +++++++++++++ examples/zoomify.js | 2 +- externs/olx.js | 4 +- src/ol/source/zoomify.js | 59 +++++++++++++++++++---------- test/spec/ol/source/zoomify.test.js | 2 +- 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 5ad22c71b8..54300c79f3 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -2,6 +2,32 @@ ### Next release +#### `ol.source.Zoomify` `url` is now a template + +The `url` for the `ol.source.Zoomify` source is now a template. The `{x}`, `{y}`, `{z}` and `{TileGroup}` placeholders +must be included in the `url`. + +If you had: +```js +new ol.source.Zoomify({ + url: 'https://www.example.com/cgi-bin/iipsrv.fcgi?zoomify=/a/b/' +}); + +``` +It needs to be changed to: +```js +new ol.source.Zoomify({ + url: 'https://www.example.com/cgi-bin/iipsrv.fcgi?zoomify=/a/b/{TileGroup}/{z}-{x}-{y}.jpg' +}); +``` + +And the `url` can now include subdomains: +```js +new ol.source.Zoomify({ + url: 'https://{a-f}.example.com/cgi-bin/iipsrv.fcgi?zoomify=/a/b/{TileGroup}/{z}-{x}-{y}.jpg' +}); +``` + #### Removal of deprecated methods The deprecated `ol.animation` functions and `map.beforeRender()` method have been removed. Use `view.animate()` instead. diff --git a/examples/zoomify.js b/examples/zoomify.js index 5c388b9b9d..660039be21 100644 --- a/examples/zoomify.js +++ b/examples/zoomify.js @@ -8,7 +8,7 @@ var imgHeight = 6100; var source = new ol.source.Zoomify({ url: 'http://vips.vtech.fr/cgi-bin/iipsrv.fcgi?zoomify=' + - '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF/', + '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF/{TileGroup}/{z}-{x}-{y}.jpg', size: [imgWidth, imgHeight], crossOrigin: 'anonymous' }); diff --git a/externs/olx.js b/externs/olx.js index 1a389cbb5b..cebfd0641f 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -6759,7 +6759,9 @@ olx.source.ZoomifyOptions.prototype.reprojectionErrorThreshold; /** - * Prefix of URL template. + * URL template. Must include `{x}`, `{y}`, `{z}` and `{TileGroup}` placeholders. + * A `{?-?}` template pattern, for example `subdomain{a-f}.domain.com`, may be + * used instead of defining each one separately in the `urls` option. * @type {!string} * @api */ diff --git a/src/ol/source/zoomify.js b/src/ol/source/zoomify.js index af575569d5..cda5f185ff 100644 --- a/src/ol/source/zoomify.js +++ b/src/ol/source/zoomify.js @@ -3,6 +3,7 @@ goog.provide('ol.source.Zoomify'); goog.require('ol'); goog.require('ol.ImageTile'); goog.require('ol.TileState'); +goog.require('ol.TileUrlFunction'); goog.require('ol.asserts'); goog.require('ol.dom'); goog.require('ol.extent'); @@ -82,32 +83,48 @@ ol.source.Zoomify = function(opt_options) { resolutions: resolutions }); - var url = options.url; + var urls = ol.TileUrlFunction.expandUrl(options.url); /** - * @this {ol.source.TileImage} - * @param {ol.TileCoord} tileCoord Tile Coordinate. - * @param {number} pixelRatio Pixel ratio. - * @param {ol.proj.Projection} projection Projection. - * @return {string|undefined} Tile URL. + * @param {string} template Template. + * @return {ol.TileUrlFunctionType} Tile URL function. */ - function tileUrlFunction(tileCoord, pixelRatio, projection) { - if (!tileCoord) { - return undefined; - } else { - var tileCoordZ = tileCoord[0]; - var tileCoordX = tileCoord[1]; - var tileCoordY = -tileCoord[2] - 1; - var tileIndex = - tileCoordX + - tileCoordY * tierSizeInTiles[tileCoordZ][0] + - tileCountUpToTier[tileCoordZ]; - var tileGroup = (tileIndex / ol.DEFAULT_TILE_SIZE) | 0; - return url + 'TileGroup' + tileGroup + '/' + - tileCoordZ + '-' + tileCoordX + '-' + tileCoordY + '.jpg'; - } + function createFromTemplate(template) { + + return ( + /** + * @param {ol.TileCoord} tileCoord Tile Coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (!tileCoord) { + return undefined; + } else { + var tileCoordZ = tileCoord[0]; + var tileCoordX = tileCoord[1]; + var tileCoordY = -tileCoord[2] - 1; + var tileIndex = + tileCoordX + + tileCoordY * tierSizeInTiles[tileCoordZ][0] + + tileCountUpToTier[tileCoordZ]; + var tileGroup = (tileIndex / ol.DEFAULT_TILE_SIZE) | 0; + var localContext = { + 'z': tileCoordZ, + 'x': tileCoordX, + 'y': tileCoordY, + 'TileGroup': 'TileGroup' + tileGroup + }; + return template.replace(/\{(\w+?)\}/g, function(m, p) { + return localContext[p]; + }); + } + }); } + var tileUrlFunction = ol.TileUrlFunction.createFromTileUrlFunctions(urls.map(createFromTemplate)); + ol.source.TileImage.call(this, { attributions: options.attributions, cacheSize: options.cacheSize, diff --git a/test/spec/ol/source/zoomify.test.js b/test/spec/ol/source/zoomify.test.js index 9bd4ae9597..4906933fbe 100644 --- a/test/spec/ol/source/zoomify.test.js +++ b/test/spec/ol/source/zoomify.test.js @@ -11,7 +11,7 @@ describe('ol.source.Zoomify', function() { var w = 1024; var h = 512; var size = [w, h]; - var url = 'zoomify-url/'; + var url = 'zoomify-url/{TileGroup}/{z}-{x}-{y}.jpg'; var proj = new ol.proj.Projection({ code: 'ZOOMIFY', units: 'pixels',