diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index cb21388ada..dd64b2c0ba 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -715,6 +715,7 @@ OpenLayers.Layer = OpenLayers.Class({ } // determine numZoomLevels if not already set on the layer + // this gives numZoomLevels assuming approximately base 2 scaling if (confProps.minResolution != null && this.options.numZoomLevels == undefined) { var ratio = confProps.maxResolution / confProps.minResolution; @@ -727,13 +728,12 @@ OpenLayers.Layer = OpenLayers.Class({ confProps.resolutions = new Array(confProps.numZoomLevels); var base = 2; if(typeof confProps.minResolution == "number" && - this.options.numZoomLevels > 1) { + confProps.numZoomLevels > 1) { /** - * If numZoomLevels is explicitly set in the layer options, - * respect it. If numZoomLevels is not specified, we use - * exponential scaling with a base of 2. If numZoomLevels - * is specified, we use exponential scaling and determine the - * appropriate base so minResolution is reached. + * If maxResolution and minResolution are set (or related + * scale properties), we calculate the base for exponential + * scaling that starts at maxResolution and ends at + * minResolution in numZoomLevels steps. */ base = Math.pow( (confProps.maxResolution / confProps.minResolution), diff --git a/tests/test_Layer.html b/tests/test_Layer.html index eecc579392..55467280e4 100644 --- a/tests/test_Layer.html +++ b/tests/test_Layer.html @@ -120,21 +120,71 @@ } function test_Layer_initResolutions(t) { - t.plan(3); + t.plan(12); var map = new OpenLayers.Map("map"); - var options = { - minResolution: 1, - maxResolution: 10, - numZoomLevels: 5 + var options, layer; + + // three tests for minResolution, maxResolution, and numZoomLevels + options = { + minResolution: 1.5, + maxResolution: 10.5, + numZoomLevels: 5, + map: map }; - var layer = new OpenLayers.Layer("test", options); - layer.map = map; + layer = new OpenLayers.Layer("test", options); layer.initResolutions(); - t.eq(layer.minResolution.toPrecision(9), (1).toPrecision(9), - "layer minResolution preserved"); - t.eq(layer.maxResolution.toPrecision(9), (10).toPrecision(9), - "layer maxResolution preserved"); - t.eq(layer.numZoomLevels, 5, "layer numZoomLevels preserved"); + t.eq(layer.minResolution.toPrecision(6), (1.5).toPrecision(6), + "(with numZoomLevels) layer minResolution preserved"); + t.eq(layer.maxResolution.toPrecision(6), (10.5).toPrecision(6), + "(with numZoomLevels) layer maxResolution preserved"); + t.eq(layer.numZoomLevels, 5, "(with numZoomLevels) layer numZoomLevels preserved"); + + // three tests for minResolution, and maxResolution + options = { + minResolution: 1.5, + maxResolution: 10.5, + map: map + }; + layer = new OpenLayers.Layer("test", options); + layer.initResolutions(); + t.eq(layer.minResolution.toPrecision(6), (1.5).toPrecision(6), + "(without numZoomLevels) layer minResolution preserved"); + t.eq(layer.maxResolution.toPrecision(6), (10.5).toPrecision(6), + "(without numZoomLevels) layer maxResolution preserved"); + t.eq(layer.numZoomLevels, 3, "(without numZoomLevels) layer numZoomLevels calculated"); + + // three tests for minScale, maxScale, and numZoomLevels + options = { + minScale: 105, + maxScale: 15, + numZoomLevels: 10, + map: map + }; + layer = new OpenLayers.Layer("test", options); + layer.initResolutions(); + t.eq(layer.minScale.toPrecision(6), (105).toPrecision(6), + "(with numZoomLevels) layer minScale preserved"); + t.eq(layer.maxScale.toPrecision(6), (15).toPrecision(6), + "(with numZoomLevels) layer maxScale preserved"); + t.eq(layer.numZoomLevels, 10, "(with numZoomLevels) layer numZoomLevels preserved"); + + // three tests for minScale, and maxScale + options = { + minScale: 1555, + maxScale: 155, + map: map + }; + layer = new OpenLayers.Layer("test", options); + layer.initResolutions(); + t.eq(layer.minScale.toPrecision(6), (1555).toPrecision(6), + "(without numZoomLevels) layer minScale preserved"); + t.eq(layer.maxScale.toPrecision(6), (155).toPrecision(6), + "(without numZoomLevels) layer maxScale preserved"); + t.eq(layer.numZoomLevels, 4, "(without numZoomLevels) layer numZoomLevels calculated"); + + map.destroy(); + + } function test_05_Layer_visibility(t) {