diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index f40df1dd09..2d39523825 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -337,6 +337,8 @@ * @property {number|undefined} opacity Opacity. * @property {number|undefined} saturation Saturation. * @property {boolean|undefined} visible Visibility. + * @property {number|undefined} minResolution MinResolution. + * @property {number|undefined} maxResolution MaxResolution. */ /** @@ -348,6 +350,8 @@ * @property {number|undefined} saturation Saturation. * @property {ol.source.Source} source Source for this layer. * @property {boolean|undefined} visible Visibility. Default is true (visible). + * @property {number|undefined} minResolution MinResolution. + * @property {number|undefined} maxResolution MaxResolution. */ /** @@ -358,6 +362,8 @@ * @property {number|undefined} opacity Opacity. * @property {number|undefined} saturation Saturation. * @property {boolean|undefined} visible Visibility. + * @property {number|undefined} minResolution MinResolution. + * @property {number|undefined} maxResolution MaxResolution. * @property {Array.|ol.Collection|undefined} layers Child layers. */ @@ -371,6 +377,8 @@ * @property {number|undefined} saturation Saturation. * @property {ol.source.Source} source Source for this layer. * @property {boolean|undefined} visible Visibility. Default is true (visible). + * @property {number|undefined} minResolution MinResolution. + * @property {number|undefined} maxResolution MaxResolution. */ /** @@ -383,6 +391,8 @@ * @property {ol.source.Source} source Source for this layer. * @property {ol.style.Style|undefined} style Style. * @property {boolean|undefined} visible Visibility. Default is true (visible). + * @property {number|undefined} minResolution MinResolution. + * @property {number|undefined} maxResolution MaxResolution. */ /** diff --git a/src/ol/layer/layerbase.js b/src/ol/layer/layerbase.js index 67ba0decc0..a87b7cd712 100644 --- a/src/ol/layer/layerbase.js +++ b/src/ol/layer/layerbase.js @@ -18,7 +18,9 @@ ol.layer.LayerProperty = { HUE: 'hue', OPACITY: 'opacity', SATURATION: 'saturation', - VISIBLE: 'visible' + VISIBLE: 'visible', + MAXRESOLUTION: 'maxresolution', + MINRESOLUTION: 'minresolution' }; @@ -29,7 +31,9 @@ ol.layer.LayerProperty = { * opacity: number, * ready: boolean, * saturation: number, - * visible: boolean}} + * visible: boolean, + * maxResolution: number, + * minResolution: number}} */ ol.layer.LayerState; @@ -58,6 +62,12 @@ ol.layer.Base = function(options) { values.saturation = goog.isDef(values.saturation) ? values.saturation : 1; /** @type {boolean} */ values.visible = goog.isDef(values.visible) ? values.visible : true; + /** @type {number} */ + values.maxResolution = goog.isDef(values.maxResolution) ? + values.maxResolution : Infinity; + /** @type {number} */ + values.minResolution = goog.isDef(values.minResolution) ? + values.minResolution : 0; this.setValues(values); @@ -67,6 +77,8 @@ ol.layer.Base = function(options) { ol.Object.getChangeEventType(ol.layer.LayerProperty.HUE), ol.Object.getChangeEventType(ol.layer.LayerProperty.OPACITY), ol.Object.getChangeEventType(ol.layer.LayerProperty.SATURATION), + ol.Object.getChangeEventType(ol.layer.LayerProperty.MAXRESOLUTION), + ol.Object.getChangeEventType(ol.layer.LayerProperty.MINRESOLUTION), goog.events.EventType.LOAD ], this.handleLayerChange, false, this); @@ -134,6 +146,8 @@ ol.layer.Base.prototype.getLayerState = function() { var ready = this.isReady(); var saturation = this.getSaturation(); var visible = this.getVisible(); + var maxResolution = this.getMaxResolution(); + var minResolution = this.getMinResolution(); return { brightness: goog.isDef(brightness) ? goog.math.clamp(brightness, -1, 1) : 0, contrast: goog.isDef(contrast) ? Math.max(contrast, 0) : 1, @@ -141,7 +155,9 @@ ol.layer.Base.prototype.getLayerState = function() { opacity: goog.isDef(opacity) ? goog.math.clamp(opacity, 0, 1) : 1, ready: ready, saturation: goog.isDef(saturation) ? Math.max(saturation, 0) : 1, - visible: goog.isDef(visible) ? !!visible : true + visible: goog.isDef(visible) ? !!visible : true, + maxResolution: goog.isDef(maxResolution) ? maxResolution : Infinity, + minResolution: goog.isDef(minResolution) ? Math.max(minResolution, 0) : 0 }; }; @@ -167,6 +183,32 @@ ol.layer.Base.prototype.getLayersArray = goog.abstractMethod; ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod; +/** + * @return {number} MaxResolution. + */ +ol.layer.Base.prototype.getMaxResolution = function() { + return /** @type {number} */ ( + this.get(ol.layer.LayerProperty.MAXRESOLUTION)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getMaxResolution', + ol.layer.Base.prototype.getMaxResolution); + + +/** + * @return {number} MinResolution. + */ +ol.layer.Base.prototype.getMinResolution = function() { + return /** @type {number} */ ( + this.get(ol.layer.LayerProperty.MINRESOLUTION)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getMinResolution', + ol.layer.Base.prototype.getMinResolution); + + /** * @return {number} Opacity. */ @@ -288,6 +330,30 @@ goog.exportProperty( ol.layer.Base.prototype.setHue); +/** + * @param {number} maxResolution MaxResolution. + */ +ol.layer.Base.prototype.setMaxResolution = function(maxResolution) { + this.set(ol.layer.LayerProperty.MAXRESOLUTION, maxResolution); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setMaxResolution', + ol.layer.Base.prototype.setMaxResolution); + + +/** + * @param {number} minResolution MinResolution. + */ +ol.layer.Base.prototype.setMinResolution = function(minResolution) { + this.set(ol.layer.LayerProperty.MINRESOLUTION, minResolution); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setMinResolution', + ol.layer.Base.prototype.setMinResolution); + + /** * @param {number} opacity Opacity. */ diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js index 205d5fe3b2..9e37389f54 100644 --- a/src/ol/layer/layergroup.js +++ b/src/ol/layer/layergroup.js @@ -206,6 +206,10 @@ ol.layer.Group.prototype.getLayerStatesArray = function(opt_obj) { layerState.opacity *= ownLayerState.opacity; layerState.saturation *= ownLayerState.saturation; layerState.visible = layerState.visible && ownLayerState.visible; + layerState.maxResolution = Math.min( + layerState.maxResolution, ownLayerState.maxResolution); + layerState.minResolution = Math.max( + layerState.minResolution, ownLayerState.minResolution); } return obj; diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index ace032ae56..f081990b78 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -114,13 +114,16 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { var layerStates = frameState.layerStates; var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; var i, ii, image, layer, layerRenderer, layerState, transform; for (i = 0, ii = layersArray.length; i < ii; ++i) { layer = layersArray[i]; layerRenderer = this.getLayerRenderer(layer); layerState = layerStates[goog.getUid(layer)]; - if (!layerState.visible || !layerState.ready) { + if (!layerState.visible || !layerState.ready || + viewResolution >= layerState.maxResolution || + viewResolution < layerState.minResolution) { continue; } layerRenderer.renderFrame(frameState, layerState); diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index 41cfeaf50f..f3b1876393 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -551,12 +551,15 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { ++this.textureCacheFrameMarkerCount_; var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; var i, ii, layer, layerRenderer, layerState; for (i = 0, ii = layersArray.length; i < ii; ++i) { layer = layersArray[i]; layerRenderer = this.getLayerRenderer(layer); layerState = frameState.layerStates[goog.getUid(layer)]; - if (layerState.visible && layerState.ready) { + if (layerState.visible && layerState.ready && + viewResolution < layerState.maxResolution && + viewResolution >= layerState.minResolution) { layerRenderer.renderFrame(frameState, layerState); } } @@ -580,10 +583,11 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { var currentProgram = null; var locations; for (i = 0, ii = layersArray.length; i < ii; ++i) { - layer = layersArray[i]; layerState = frameState.layerStates[goog.getUid(layer)]; - if (!layerState.visible || !layerState.ready) { + if (!layerState.visible || !layerState.ready || + viewResolution >= layerState.maxResolution || + viewResolution < layerState.minResolution) { continue; } var useColor =