From 5fe1b76e19ecc51a40b4806123f53fc8023c8519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 17 Nov 2010 12:51:22 +0000 Subject: [PATCH] Layer.XYZ: support a subset of server resolutions, p=bbinet, r=me (closes #2909) git-svn-id: http://svn.openlayers.org/trunk/openlayers@10903 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Layer/XYZ.js | 15 +++++++++++++-- tests/Layer/XYZ.html | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/OpenLayers/Layer/XYZ.js b/lib/OpenLayers/Layer/XYZ.js index 6aba72fe73..ef421b52de 100644 --- a/lib/OpenLayers/Layer/XYZ.js +++ b/lib/OpenLayers/Layer/XYZ.js @@ -40,10 +40,19 @@ OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, { * for a requested tile. For example, if you supply a zoomOffset * of 3, when the map is at the zoom 0, tiles will be requested from * level 3 of your cache. Default is 0 (assumes cache level and map - * zoom are equivalent). + * zoom are equivalent). Using is an alternative to + * setting if you only want to expose a subset + * of the server resolutions. */ zoomOffset: 0, + /** + * APIProperty: serverResolutions + * {Array} A list of all resolutions available on the server. Only set this + * property if the map resolutions differs from the server. + */ + serverResolutions: null, + /** * Constructor: OpenLayers.Layer.XYZ * @@ -114,7 +123,9 @@ OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, { / (res * this.tileSize.w)); var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h)); - var z = this.map.getZoom() + this.zoomOffset; + var z = this.serverResolutions != null ? + OpenLayers.Util.indexOf(this.serverResolutions, res) : + this.map.getZoom() + this.zoomOffset; var url = this.url; var s = '' + x + y + z; diff --git a/tests/Layer/XYZ.html b/tests/Layer/XYZ.html index 364b147fe6..b37b8e9477 100644 --- a/tests/Layer/XYZ.html +++ b/tests/Layer/XYZ.html @@ -148,6 +148,31 @@ map.destroy(); } + function test_Layer_XYZ_serverResolutions(t) { + t.plan(2); + + var map = new OpenLayers.Map('map', { + resolutions: [13,11] + }); + + var layer = new OpenLayers.Layer.XYZ(name, url, options); + map.addLayer(layer); + map.setCenter(new OpenLayers.LonLat(0,0), 1); + + var tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0)); + var level = parseInt(tileurl.split('/')[7]); + t.eq(map.getZoom(), level, "Tile zoom level is correct without serverResolutions"); + + layer.serverResolutions = [14,13,12,11,10]; + tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0)); + level = parseInt(tileurl.split('/')[7]); + var res = map.getResolution(); + var gotLevel = OpenLayers.Util.indexOf(layer.serverResolutions, res); + t.eq(gotLevel, level, "Tile zoom level is correct with serverResolutions"); + + map.destroy(); + } + function test_zoomOffset(t) { t.plan(2);