diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 63f2beeef7..67a9dfda77 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -274,6 +274,18 @@ OpenLayers.Layer = OpenLayers.Class({ * {Integer} */ numZoomLevels: null, + + /** + * Property: restrictedMinZoom + * {Integer} Restriction of the minimum zoom level. This is used for layers + * that only use a subset of the resolutions in the + * array. This is independent of , which always starts + * counting at zoom level 0. If restrictedMinZoom is e.g. set to 2, + * the first two zoom levels (0 and 1) will not be used by this layer. + * If the layer is a base layer, zooming to the map's maxExtent means + * setting the map's zoom to 2. + */ + restrictedMinZoom: 0, /** * APIProperty: minScale @@ -740,7 +752,8 @@ OpenLayers.Layer = OpenLayers.Class({ } else { if (this.map) { var resolution = this.map.getResolution(); - inRange = ( (resolution >= this.minResolution) && + inRange = ( this.map.getZoom() >= this.restrictedMinZoom && + (resolution >= this.minResolution) && (resolution <= this.maxResolution) ); } } @@ -1171,7 +1184,7 @@ OpenLayers.Layer = OpenLayers.Class({ } zoom = Math.max(0, i-1); } - return zoom; + return Math.max(this.restrictedMinZoom, zoom); }, /** diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index d4563e4614..b57ca2d945 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -1800,8 +1800,8 @@ OpenLayers.Map = OpenLayers.Class({ * within the min/max range of zoom levels. */ isValidZoomLevel: function(zoomLevel) { - return ( (zoomLevel != null) && - (zoomLevel >= 0) && + return ( (zoomLevel != null) && + (zoomLevel >= this.getRestrictedMinZoom()) && (zoomLevel < this.getNumZoomLevels()) ); }, @@ -1905,6 +1905,20 @@ OpenLayers.Map = OpenLayers.Class({ return maxExtent; }, + /** + * Method: getRestricteMinZoom + * + * Returns: + * {Integer} the minimum zoom level allowed for the current baseLayer. + */ + getRestrictedMinZoom: function() { + var minZoom = null; + if (this.baseLayer != null) { + minZoom = this.baseLayer.restrictedMinZoom; + } + return minZoom; + }, + /** * APIMethod: getNumZoomLevels * diff --git a/tests/Layer.html b/tests/Layer.html index 3b8ca415bf..22b781a6fe 100644 --- a/tests/Layer.html +++ b/tests/Layer.html @@ -556,7 +556,7 @@ function test_Layer_getZoomForResolution(t) { - t.plan(12); + t.plan(13); var layer = new OpenLayers.Layer('Test Layer'); layer.map = {}; @@ -584,6 +584,9 @@ "(fractionalZoom) doesn't return zoom below zero"); t.eq(layer.getZoomForResolution(1).toPrecision(6), (layer.resolutions.length - 1).toPrecision(6), "(fractionalZoom) doesn't return zoom above highest index"); + + layer.restrictedMinZoom = 1; + t.eq(layer.getZoomForResolution(200), 1, "zoom all the way out, but we have a restrictedMinZoom of 1"); } diff --git a/tests/Map.html b/tests/Map.html index 8d37fc67ad..43a83462bc 100644 --- a/tests/Map.html +++ b/tests/Map.html @@ -326,6 +326,34 @@ } */ + function test_Map_isValidZoomLevel(t) { + t.plan(6); + var map = new OpenLayers.Map("map"); + map.addLayer(new OpenLayers.Layer(null, { + isBaseLayer: true, numZoomLevels: 19 + })) + var valid; + + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [0]); + t.eq(valid, true, "0 is a valid zoomLevel when baseLayer has no restrictedMinZoom"); + + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [18]); + t.eq(valid, true, "18 is a valid zoomLevel"); + + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [19]); + t.eq(valid, false, "19 is not a valid zoomLevel"); + + map.baseLayer.restrictedMinZoom = 1; + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [0]); + t.eq(valid, false, "0 is not a valid zoomLevel when baseLayer has restrictedMinZoom of 1"); + + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [1]); + t.eq(valid, true, "1 is a valid zoomLevel"); + + valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [19]); + t.eq(valid, false, "19 is not a valid zoomLevel when baseLayer has restrictedMinZoom of 1"); + } + function test_Map_isValidLonLat(t) { t.plan( 3 ); @@ -1234,6 +1262,27 @@ t.ok(maxExtent == map.baseLayer.maxExtent, "null options, valid baseLayer returns map.baseLayer.maxExtent"); } + function test_Map_getRestrictedMinZoom(t){ + t.plan(3); + + var map = {}; + + //no baseLayer + var minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map); + t.eq(minZoom, null, "no baseLayer returns null"); + + map.baseLayer = new OpenLayers.Layer(null, {isBaseLayer: true}); + + //baseLayer + minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map); + t.eq(minZoom, 0, "default baseLayer.restrictedMinZoom returns 0"); + + //custom minZoomLevel on baseLayer + map.baseLayer.restrictedMinZoom = 1; + minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map); + t.eq(minZoom, map.baseLayer.restrictedMinZoom, "custom baseLayer.restrictedMinZoom returns map.baseLayer.restrictedMinZoom"); + } + function test_Map_zoomToMaxExtent(t){ t.plan(4)