From 42f953d08d39223baa12828642cbe032930dc26c Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 6 Jul 2014 17:11:39 -0600 Subject: [PATCH 1/6] Function for getting extent intersection --- src/ol/extent.js | 49 ++++++++++++++++++++++++++++++++----- test/spec/ol/extent.test.js | 24 ++++++++++++++++++ 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/ol/extent.js b/src/ol/extent.js index f6fbdfb21c..1f7d84bfdb 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -418,7 +418,11 @@ ol.extent.extendXY = function(extent, x, y) { * @return {number} Area. */ ol.extent.getArea = function(extent) { - return ol.extent.getWidth(extent) * ol.extent.getHeight(extent); + var area = 0; + if (!ol.extent.isEmpty(extent)) { + area = ol.extent.getWidth(extent) * ol.extent.getHeight(extent); + } + return area; }; @@ -511,11 +515,44 @@ ol.extent.getHeight = function(extent) { * @return {number} Intersection area. */ ol.extent.getIntersectionArea = function(extent1, extent2) { - var minX = Math.max(extent1[0], extent2[0]); - var minY = Math.max(extent1[1], extent2[1]); - var maxX = Math.min(extent1[2], extent2[2]); - var maxY = Math.min(extent1[3], extent2[3]); - return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); + var intersection = ol.extent.getIntersection(extent1, extent2); + return ol.extent.getArea(intersection); +}; + + +/** + * Get the intersection of two extents. + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @param {ol.Extent=} opt_extent Optional extent to populate with intersection. + * @return {ol.Extent} Intersecting extent. + */ +ol.extent.getIntersection = function(extent1, extent2, opt_extent) { + var intersection = goog.isDef(opt_extent) ? + opt_extent : ol.extent.createEmpty(); + if (ol.extent.intersects(extent1, extent2)) { + if (extent1[0] > extent2[0]) { + intersection[0] = extent1[0]; + } else { + intersection[0] = extent2[0]; + } + if (extent1[1] > extent2[1]) { + intersection[1] = extent1[1]; + } else { + intersection[1] = extent2[1]; + } + if (extent1[2] < extent2[2]) { + intersection[2] = extent1[2]; + } else { + intersection[2] = extent2[2]; + } + if (extent1[3] < extent2[3]) { + intersection[3] = extent1[3]; + } else { + intersection[3] = extent2[3]; + } + } + return intersection; }; diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index a8dfcc5e37..4a884b64ab 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -24,6 +24,30 @@ describe('ol.extent', function() { }); + describe('getIntersection()', function() { + it('returns the intersection of two extents', function() { + var world = [-180, -90, 180, 90]; + var north = [-180, 0, 180, 90]; + var farNorth = [-180, 45, 180, 90]; + var east = [0, -90, 180, 90]; + var farEast = [90, -90, 180, 90]; + var south = [-180, -90, 180, 0]; + var farSouth = [-180, -90, 180, -45]; + var west = [-180, -90, 0, 90]; + var farWest = [-180, -90, -90, 90]; + var none = ol.extent.createEmpty(); + expect(ol.extent.getIntersection(world, none)).to.eql(none); + expect(ol.extent.getIntersection(world, north)).to.eql(north); + expect(ol.extent.getIntersection(world, east)).to.eql(east); + expect(ol.extent.getIntersection(world, south)).to.eql(south); + expect(ol.extent.getIntersection(world, west)).to.eql(west); + expect(ol.extent.getIntersection(farEast, farWest)).to.eql(none); + expect(ol.extent.getIntersection(farNorth, farSouth)).to.eql(none); + expect(ol.extent.getIntersection(north, west)).to.eql([-180, 0, 0, 90]); + expect(ol.extent.getIntersection(east, south)).to.eql([0, -90, 180, 0]); + }); + }); + describe('containsCoordinate', function() { describe('positive', function() { From 1daf36956cd6e70773e5c669762df1d49e8b3450 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 6 Jul 2014 17:56:54 -0600 Subject: [PATCH 2/6] Layer extent option If provided, the layer extent will be used to limit data requests and rendering. If undefined, to limit will be imposed. --- externs/olx.js | 53 ++++++++++++++++++++++++ src/ol/layer/layerbase.js | 35 ++++++++++++++++ src/ol/layer/layergroup.js | 5 +++ test/spec/ol/layer/layer.test.js | 5 +++ test/spec/ol/layer/layergroup.test.js | 58 +++++++++++++++++++++++++++ 5 files changed, 156 insertions(+) diff --git a/externs/olx.js b/externs/olx.js index ad1c275762..5d03d0b633 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -1969,6 +1969,7 @@ olx.interaction.SelectOptions.prototype.toggleCondition; * opacity: (number|undefined), * saturation: (number|undefined), * visible: (boolean|undefined), + * extent: (ol.Extent|undefined), * minResolution: (number|undefined), * maxResolution: (number|undefined)}} * @api @@ -2018,6 +2019,14 @@ olx.layer.BaseOptions.prototype.saturation; olx.layer.BaseOptions.prototype.visible; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.BaseOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} @@ -2040,6 +2049,7 @@ olx.layer.BaseOptions.prototype.maxResolution; * saturation: (number|undefined), * source: ol.source.Source, * visible: (boolean|undefined), + * extent: (ol.Extent|undefined), * minResolution: (number|undefined), * maxResolution: (number|undefined)}} * @api @@ -2096,6 +2106,14 @@ olx.layer.LayerOptions.prototype.source; olx.layer.LayerOptions.prototype.visible; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.LayerOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} @@ -2117,6 +2135,7 @@ olx.layer.LayerOptions.prototype.maxResolution; * opacity: (number|undefined), * saturation: (number|undefined), * visible: (boolean|undefined), + * extent: (ol.Extent|undefined), * minResolution: (number|undefined), * maxResolution: (number|undefined), * layers: (Array.|ol.Collection|undefined)}} @@ -2167,6 +2186,14 @@ olx.layer.GroupOptions.prototype.saturation; olx.layer.GroupOptions.prototype.visible; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.GroupOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} @@ -2197,6 +2224,7 @@ olx.layer.GroupOptions.prototype.layers; * blur: (number|undefined), * shadow: (number|undefined), * weight: (string|function(ol.Feature):number|undefined), + * extent: (ol.Extent|undefined), * minResolution: (number|undefined), * maxResolution: (number|undefined), * opacity: (number|undefined), @@ -2267,6 +2295,14 @@ olx.layer.HeatmapOptions.prototype.shadow; olx.layer.HeatmapOptions.prototype.weight; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.HeatmapOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} @@ -2318,6 +2354,7 @@ olx.layer.HeatmapOptions.prototype.visible; * saturation: (number|undefined), * source: ol.source.Source, * visible: (boolean|undefined), + * extent: (ol.Extent|undefined), * minResolution: (number|undefined), * maxResolution: (number|undefined), * useInterimTilesOnError: (boolean|undefined)}} @@ -2382,6 +2419,14 @@ olx.layer.TileOptions.prototype.source; olx.layer.TileOptions.prototype.visible; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.TileOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} @@ -2450,6 +2495,14 @@ olx.layer.VectorOptions.prototype.renderOrder; olx.layer.VectorOptions.prototype.hue; +/** + * The bounding extent for layer rendering. The layer will not be rendered + * outside of this extent. + * @type {ol.Extent|undefined} + */ +olx.layer.VectorOptions.prototype.extent; + + /** * The minimum resolution (inclusive) at which this layer will be visible. * @type {number|undefined} diff --git a/src/ol/layer/layerbase.js b/src/ol/layer/layerbase.js index f2c9c1b6b6..51652f0cde 100644 --- a/src/ol/layer/layerbase.js +++ b/src/ol/layer/layerbase.js @@ -19,6 +19,7 @@ ol.layer.LayerProperty = { OPACITY: 'opacity', SATURATION: 'saturation', VISIBLE: 'visible', + EXTENT: 'extent', MAX_RESOLUTION: 'maxResolution', MIN_RESOLUTION: 'minResolution' }; @@ -33,6 +34,7 @@ ol.layer.LayerProperty = { * saturation: number, * sourceState: ol.source.State, * visible: boolean, + * extent: (ol.Extent|undefined), * maxResolution: number, * minResolution: number}} */ @@ -141,6 +143,7 @@ ol.layer.Base.prototype.getLayerState = function() { var saturation = this.getSaturation(); var sourceState = this.getSourceState(); var visible = this.getVisible(); + var extent = this.getExtent(); var maxResolution = this.getMaxResolution(); var minResolution = this.getMinResolution(); return { @@ -152,6 +155,7 @@ ol.layer.Base.prototype.getLayerState = function() { saturation: goog.isDef(saturation) ? Math.max(saturation, 0) : 1, sourceState: sourceState, visible: goog.isDef(visible) ? !!visible : true, + extent: extent, maxResolution: goog.isDef(maxResolution) ? maxResolution : Infinity, minResolution: goog.isDef(minResolution) ? Math.max(minResolution, 0) : 0 }; @@ -174,6 +178,21 @@ ol.layer.Base.prototype.getLayersArray = goog.abstractMethod; ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod; +/** + * @return {ol.Extent|undefined} The layer extent. + * @observable + * @api + */ +ol.layer.Base.prototype.getExtent = function() { + return /** @type {ol.Extent|undefined} */ ( + this.get(ol.layer.LayerProperty.EXTENT)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getExtent', + ol.layer.Base.prototype.getExtent); + + /** * @return {number|undefined} The maximum resolution of the layer. * @observable @@ -320,6 +339,22 @@ goog.exportProperty( ol.layer.Base.prototype.setHue); +/** + * Set the extent at which the layer is visible. If `undefined`, the layer + * will be visible at all extents. + * @param {ol.Extent|undefined} extent The extent of the layer. + * @observable + * @api + */ +ol.layer.Base.prototype.setExtent = function(extent) { + this.set(ol.layer.LayerProperty.EXTENT, extent); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setExtent', + ol.layer.Base.prototype.setExtent); + + /** * @param {number|undefined} maxResolution The maximum resolution of the layer. * @observable diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js index daf4b8e099..fc6edd8579 100644 --- a/src/ol/layer/layergroup.js +++ b/src/ol/layer/layergroup.js @@ -11,6 +11,7 @@ goog.require('ol.CollectionEvent'); goog.require('ol.CollectionEventType'); goog.require('ol.Object'); goog.require('ol.ObjectEventType'); +goog.require('ol.extent'); goog.require('ol.layer.Base'); goog.require('ol.source.State'); @@ -211,6 +212,10 @@ ol.layer.Group.prototype.getLayerStatesArray = function(opt_states) { layerState.maxResolution, ownLayerState.maxResolution); layerState.minResolution = Math.max( layerState.minResolution, ownLayerState.minResolution); + if (goog.isDef(ownLayerState.extent) && goog.isDef(layerState.extent)) { + layerState.extent = ol.extent.getIntersection( + layerState.extent, ownLayerState.extent); + } } return states; diff --git a/test/spec/ol/layer/layer.test.js b/test/spec/ol/layer/layer.test.js index be6297f268..71bea3b08d 100644 --- a/test/spec/ol/layer/layer.test.js +++ b/test/spec/ol/layer/layer.test.js @@ -56,6 +56,7 @@ describe('ol.layer.Layer', function() { saturation: 1, visible: true, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); @@ -99,6 +100,7 @@ describe('ol.layer.Layer', function() { saturation: 5, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: 500, minResolution: 0.25 }); @@ -191,6 +193,7 @@ describe('ol.layer.Layer', function() { saturation: 0.3, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: 500, minResolution: 0.25 }); @@ -212,6 +215,7 @@ describe('ol.layer.Layer', function() { saturation: 0, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); @@ -231,6 +235,7 @@ describe('ol.layer.Layer', function() { saturation: 42, visible: true, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); diff --git a/test/spec/ol/layer/layergroup.test.js b/test/spec/ol/layer/layergroup.test.js index d26885f25f..b9c6918842 100644 --- a/test/spec/ol/layer/layergroup.test.js +++ b/test/spec/ol/layer/layergroup.test.js @@ -52,6 +52,7 @@ describe('ol.layer.Group', function() { saturation: 1, visible: true, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); @@ -179,6 +180,7 @@ describe('ol.layer.Group', function() { saturation: 5, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: 500, minResolution: 0.25 }); @@ -190,6 +192,56 @@ describe('ol.layer.Group', function() { goog.dispose(layerGroup); }); + it('accepts an extent option', function() { + var layer = new ol.layer.Layer({ + source: new ol.source.Source({ + projection: 'EPSG:4326' + }) + }); + + var groupExtent = [-10, -5, 10, 5]; + var layerGroup = new ol.layer.Group({ + layers: [layer], + brightness: 0.5, + contrast: 10, + hue: 180, + opacity: 0.5, + saturation: 5, + visible: false, + extent: groupExtent, + maxResolution: 500, + minResolution: 0.25 + }); + + expect(layerGroup.getBrightness()).to.be(0.5); + expect(layerGroup.getContrast()).to.be(10); + expect(layerGroup.getHue()).to.be(180); + expect(layerGroup.getOpacity()).to.be(0.5); + expect(layerGroup.getSaturation()).to.be(5); + expect(layerGroup.getVisible()).to.be(false); + expect(layerGroup.getExtent()).to.eql(groupExtent); + expect(layerGroup.getMaxResolution()).to.be(500); + expect(layerGroup.getMinResolution()).to.be(0.25); + expect(layerGroup.getLayerState()).to.eql({ + layer: layerGroup, + brightness: 0.5, + contrast: 10, + hue: 180, + opacity: 0.5, + saturation: 5, + visible: false, + sourceState: ol.source.State.READY, + extent: groupExtent, + maxResolution: 500, + minResolution: 0.25 + }); + expect(layerGroup.getLayers()).to.be.a(ol.Collection); + expect(layerGroup.getLayers().getLength()).to.be(1); + expect(layerGroup.getLayers().item(0)).to.be(layer); + + goog.dispose(layer); + goog.dispose(layerGroup); + }); }); describe('#getLayerState', function() { @@ -211,6 +263,8 @@ describe('ol.layer.Group', function() { layerGroup.setOpacity(0.3); layerGroup.setSaturation(0.3); layerGroup.setVisible(false); + var groupExtent = [-100, 50, 100, 50]; + layerGroup.setExtent(groupExtent); layerGroup.setMaxResolution(500); layerGroup.setMinResolution(0.25); expect(layerGroup.getLayerState()).to.eql({ @@ -222,6 +276,7 @@ describe('ol.layer.Group', function() { saturation: 0.3, visible: false, sourceState: ol.source.State.READY, + extent: groupExtent, maxResolution: 500, minResolution: 0.25 }); @@ -243,6 +298,7 @@ describe('ol.layer.Group', function() { saturation: 0, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); @@ -262,6 +318,7 @@ describe('ol.layer.Group', function() { saturation: 42, visible: true, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: Infinity, minResolution: 0 }); @@ -384,6 +441,7 @@ describe('ol.layer.Group', function() { saturation: 25, visible: false, sourceState: ol.source.State.READY, + extent: undefined, maxResolution: 150, minResolution: 0.25 }); From 234cff4de51c4378104bbbc8a3afeecffb89f3a0 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 6 Jul 2014 18:43:08 -0600 Subject: [PATCH 3/6] Limit image layer requests to layer extent This has two nice consequences that can be seen in the wms-image.js and mapbuide-untiled.js examples: * no images are requested when you browse outside of the layer extent * when the layer extent is within the viewport extent, cached images are used since the intersecting extent is the same for multiple viewport extents --- examples/mapguide-untiled.js | 4 ++-- examples/wms-image.js | 4 ++-- src/ol/renderer/canvas/canvasimagelayerrenderer.js | 12 ++++++++++-- src/ol/renderer/dom/domimagelayerrenderer.js | 12 ++++++++++-- src/ol/renderer/webgl/webglimagelayerrenderer.js | 11 +++++++++-- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/examples/mapguide-untiled.js b/examples/mapguide-untiled.js index d3908b1ed9..007848e9eb 100644 --- a/examples/mapguide-untiled.js +++ b/examples/mapguide-untiled.js @@ -15,6 +15,7 @@ var bounds = [ var map = new ol.Map({ layers: [ new ol.layer.Image({ + extent: bounds, source: new ol.source.MapGuide({ projection: 'EPSG:4326', url: agentUrl, @@ -24,8 +25,7 @@ var map = new ol.Map({ MAPDEFINITION: mdf, FORMAT: 'PNG' }, - ratio: 2, - extent: bounds + ratio: 2 }) }) ], diff --git a/examples/wms-image.js b/examples/wms-image.js index fbc573ab8c..adcb74dcf9 100644 --- a/examples/wms-image.js +++ b/examples/wms-image.js @@ -11,11 +11,11 @@ var layers = [ source: new ol.source.MapQuest({layer: 'sat'}) }), new ol.layer.Image({ + extent: [-13884991, 2870341, -7455066, 6338219], source: new ol.source.ImageWMS({ url: 'http://demo.opengeo.org/geoserver/wms', params: {'LAYERS': 'topp:states'}, - serverType: 'geoserver', - extent: [-13884991, 2870341, -7455066, 6338219] + serverType: 'geoserver' }) }) ]; diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 706a64b3eb..b03f771ec5 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -7,6 +7,7 @@ goog.require('goog.vec.Mat4'); goog.require('ol.ImageBase'); goog.require('ol.ImageState'); goog.require('ol.ViewHint'); +goog.require('ol.extent'); goog.require('ol.layer.Image'); goog.require('ol.renderer.Map'); goog.require('ol.renderer.canvas.Layer'); @@ -102,9 +103,16 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = var hints = frameState.viewHints; - if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + var renderedExtent = frameState.extent; + if (goog.isDef(layerState.extent)) { + renderedExtent = ol.extent.getIntersection( + renderedExtent, layerState.extent); + } + + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] && + !ol.extent.isEmpty(renderedExtent)) { image = imageSource.getImage( - frameState.extent, viewResolution, pixelRatio, viewState.projection); + renderedExtent, viewResolution, pixelRatio, viewState.projection); if (!goog.isNull(image)) { var imageState = image.getState(); if (imageState == ol.ImageState.IDLE) { diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js index dca23f358e..5300e5e361 100644 --- a/src/ol/renderer/dom/domimagelayerrenderer.js +++ b/src/ol/renderer/dom/domimagelayerrenderer.js @@ -10,6 +10,7 @@ goog.require('ol.ImageBase'); goog.require('ol.ImageState'); goog.require('ol.ViewHint'); goog.require('ol.dom'); +goog.require('ol.extent'); goog.require('ol.layer.Image'); goog.require('ol.renderer.dom.Layer'); goog.require('ol.source.Image'); @@ -89,8 +90,15 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame = var hints = frameState.viewHints; - if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { - var image_ = imageSource.getImage(frameState.extent, viewResolution, + var renderedExtent = frameState.extent; + if (goog.isDef(layerState.extent)) { + renderedExtent = ol.extent.getIntersection( + renderedExtent, layerState.extent); + } + + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] && + !ol.extent.isEmpty(renderedExtent)) { + var image_ = imageSource.getImage(renderedExtent, viewResolution, frameState.pixelRatio, viewState.projection); if (!goog.isNull(image_)) { var imageState = image_.getState(); diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index b9187754ed..37976f8d3b 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -10,6 +10,7 @@ goog.require('ol.Extent'); goog.require('ol.ImageBase'); goog.require('ol.ImageState'); goog.require('ol.ViewHint'); +goog.require('ol.extent'); goog.require('ol.layer.Image'); goog.require('ol.renderer.webgl.Layer'); goog.require('ol.source.Image'); @@ -119,8 +120,14 @@ ol.renderer.webgl.ImageLayer.prototype.prepareFrame = var hints = frameState.viewHints; - if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { - var image_ = imageSource.getImage(frameState.extent, viewResolution, + var renderedExtent = frameState.extent; + if (goog.isDef(layerState.extent)) { + renderedExtent = ol.extent.getIntersection( + renderedExtent, layerState.extent); + } + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] && + !ol.extent.isEmpty(renderedExtent)) { + var image_ = imageSource.getImage(renderedExtent, viewResolution, frameState.pixelRatio, viewState.projection); if (!goog.isNull(image_)) { var imageState = image_.getState(); From 2b0284a342bd2e573797cb361f6145df846d60f5 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 6 Jul 2014 23:30:59 -0600 Subject: [PATCH 4/6] Only request tiles within the layer extent Layer renderers are now responsible for requesting data within a limited extent. --- examples/wms-custom-proj.js | 4 ++-- examples/wms-image-custom-proj.js | 8 ++++---- examples/wms-tiled.js | 2 +- examples/wmts-hidpi.html | 5 +++++ examples/wmts-hidpi.js | 2 +- examples/wmts.js | 2 +- src/ol/renderer/canvas/canvastilelayerrenderer.js | 10 ++++++++++ src/ol/renderer/dom/domtilelayerrenderer.js | 5 +++++ src/ol/renderer/webgl/webgltilelayerrenderer.js | 11 +++++++++-- 9 files changed, 38 insertions(+), 11 deletions(-) diff --git a/examples/wms-custom-proj.js b/examples/wms-custom-proj.js index e3b5f2920b..1a34e76ed1 100644 --- a/examples/wms-custom-proj.js +++ b/examples/wms-custom-proj.js @@ -44,6 +44,7 @@ ol.proj.addCoordinateTransforms('EPSG:4326', projection, var extent = [420000, 30000, 900000, 350000]; var layers = [ new ol.layer.Tile({ + extent: extent, source: new ol.source.TileWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', @@ -57,11 +58,11 @@ var layers = [ 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', 'FORMAT': 'image/jpeg' }, - extent: extent, serverType: 'mapserver' }) }), new ol.layer.Tile({ + extent: extent, source: new ol.source.TileWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', @@ -72,7 +73,6 @@ var layers = [ 'National parks / geo.admin.ch' })], params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, - extent: extent, serverType: 'mapserver' }) }) diff --git a/examples/wms-image-custom-proj.js b/examples/wms-image-custom-proj.js index b12037033d..f48c9c256a 100644 --- a/examples/wms-image-custom-proj.js +++ b/examples/wms-image-custom-proj.js @@ -24,6 +24,7 @@ projection.setExtent([485869.5728, 76443.1884, 837076.5648, 299941.7864]); var extent = [420000, 30000, 900000, 350000]; var layers = [ new ol.layer.Image({ + extent: extent, source: new ol.source.ImageWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', @@ -37,11 +38,11 @@ var layers = [ 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', 'FORMAT': 'image/jpeg' }, - serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver'), - extent: extent + serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver') }) }), new ol.layer.Image({ + extent: extent, source: new ol.source.ImageWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', @@ -52,8 +53,7 @@ var layers = [ 'National parks / geo.admin.ch' })], params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, - serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver'), - extent: extent + serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver') }) }) ]; diff --git a/examples/wms-tiled.js b/examples/wms-tiled.js index 86f5503f62..9815eb8d17 100644 --- a/examples/wms-tiled.js +++ b/examples/wms-tiled.js @@ -10,10 +10,10 @@ var layers = [ source: new ol.source.MapQuest({layer: 'sat'}) }), new ol.layer.Tile({ + extent: [-13884991, 2870341, -7455066, 6338219], source: new ol.source.TileWMS(/** @type {olx.source.TileWMSOptions} */ ({ url: 'http://demo.opengeo.org/geoserver/wms', params: {'LAYERS': 'topp:states', 'TILED': true}, - extent: [-13884991, 2870341, -7455066, 6338219], serverType: 'geoserver' })) }) diff --git a/examples/wmts-hidpi.html b/examples/wmts-hidpi.html index 71f31e5648..e6f4e3d824 100644 --- a/examples/wmts-hidpi.html +++ b/examples/wmts-hidpi.html @@ -9,6 +9,11 @@ WMTS HiDPI example + diff --git a/examples/wmts-hidpi.js b/examples/wmts-hidpi.js index c0633601e1..e84d2ec529 100644 --- a/examples/wmts-hidpi.js +++ b/examples/wmts-hidpi.js @@ -23,7 +23,6 @@ var urls = [ var hiDPI = ol.BrowserFeature.DEVICE_PIXEL_RATIO > 1; var source = new ol.source.WMTS({ - extent: [977844.377599999, 5837774.6617, 1915609.8654, 6295560.8122], projection: 'EPSG:3857', layer: hiDPI ? 'bmaphidpi' : 'geolandbasemap', tilePixelRatio: hiDPI ? 2 : 1, @@ -64,6 +63,7 @@ var source = new ol.source.WMTS({ var map = new ol.Map({ layers: [ new ol.layer.Tile({ + extent: [977844.377599999, 5837774.6617, 1915609.8654, 6295560.8122], source: source }) ], diff --git a/examples/wmts.js b/examples/wmts.js index 6c64105f18..b8daeb176a 100644 --- a/examples/wmts.js +++ b/examples/wmts.js @@ -35,6 +35,7 @@ var map = new ol.Map({ }), new ol.layer.Tile({ opacity: 0.7, + extent: projectionExtent, source: new ol.source.WMTS({ attributions: [attribution], url: 'http://services.arcgisonline.com/arcgis/rest/' + @@ -48,7 +49,6 @@ var map = new ol.Map({ resolutions: resolutions, matrixIds: matrixIds }), - extent: projectionExtent, style: 'default' }) }) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index fce4840011..6fd8025e35 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -193,6 +193,11 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = } else { extent = frameState.extent; } + + if (goog.isDef(layerState.extent)) { + extent = ol.extent.getIntersection(extent, layerState.extent); + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution( extent, tileResolution); @@ -233,6 +238,11 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = if (z != this.renderedCanvasZ_ || !this.renderedCanvasTileRange_.containsTileRange(tileRange)) { this.renderedCanvasTileRange_ = null; + // Due to limited layer extent, we may be rendering tiles on a small + // portion of the canvas. + if (z < this.renderedCanvasZ_) { + this.context_.clearRect(0, 0, canvasWidth, canvasHeight); + } } } } diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index a41ac5837a..cb6c14dda9 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -109,6 +109,11 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame = } else { extent = frameState.extent; } + + if (goog.isDef(layerState.extent)) { + extent = ol.extent.getIntersection(extent, layerState.extent); + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution( extent, tileResolution); diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index e6269184a0..bfbae29cf8 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -207,11 +207,18 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame = var allTilesLoaded = true; var tmpExtent = ol.extent.createEmpty(); var tmpTileRange = new ol.TileRange(0, 0, 0, 0); - var childTileRange, fullyLoaded, tile, tileState, x, y; + var childTileRange, fullyLoaded, tile, tileState, x, y, tileExtent; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { tile = tileSource.getTile(z, x, y, pixelRatio, projection); + if (goog.isDef(layerState.extent)) { + // ignore tiles outside layer extent + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); + if (!ol.extent.intersects(tileExtent, layerState.extent)) { + continue; + } + } tileState = tile.getState(); if (tileState == ol.TileState.LOADED) { if (mapRenderer.isTileTextureLoaded(tile)) { @@ -243,7 +250,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame = var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); goog.array.sort(zs); var u_tileOffset = goog.vec.Vec4.createFloat32(); - var i, ii, sx, sy, tileExtent, tileKey, tilesToDraw, tx, ty; + var i, ii, sx, sy, tileKey, tilesToDraw, tx, ty; for (i = 0, ii = zs.length; i < ii; ++i) { tilesToDraw = tilesToDrawByZ[zs[i]]; for (tileKey in tilesToDraw) { From 7bbd27e68e83486362dd1f94a839f7825dd3c73b Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 7 Jul 2014 23:00:05 -0600 Subject: [PATCH 5/6] ol.tilegrid.TileGrid doesn't accept an extent option Tile grids cannot currently be constructed with an extent (though we should perhaps provide a function that allows this - see https://github.com/tschaub/ol3/commit/68815dca10ef006294c767efe9592b682c48dc5f for an example). --- test/spec/ol/source/tilesource.test.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/test/spec/ol/source/tilesource.test.js b/test/spec/ol/source/tilesource.test.js index bb668d6b2b..f893e8d61e 100644 --- a/test/spec/ol/source/tilesource.test.js +++ b/test/spec/ol/source/tilesource.test.js @@ -20,7 +20,8 @@ describe('ol.source.Tile', function() { var loadedTilesByZ = {}; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 3); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 3); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -42,7 +43,8 @@ describe('ol.source.Tile', function() { var loadedTilesByZ = {}; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 0); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 0); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -66,7 +68,8 @@ describe('ol.source.Tile', function() { var loadedTilesByZ = {}; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 1); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -92,7 +95,8 @@ describe('ol.source.Tile', function() { var loadedTilesByZ = {}; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 1); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ? @@ -117,7 +121,8 @@ describe('ol.source.Tile', function() { } }; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 1); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -140,7 +145,8 @@ describe('ol.source.Tile', function() { var loadedTilesByZ = {}; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 1); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -165,7 +171,8 @@ describe('ol.source.Tile', function() { } }; var grid = source.getTileGrid(); - var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); + var extent = [-180, -180, 180, 180]; + var range = grid.getTileRangeForExtentAndZ(extent, 1); function getTileIfLoaded(z, x, y) { var tile = source.getTile(z, x, y); @@ -192,16 +199,13 @@ describe('ol.source.Tile', function() { * @param {Object.} loaded Lookup of already loaded tiles. */ ol.test.source.TileMock = function(loaded) { - var extent = [-180, -180, 180, 180]; var tileGrid = new ol.tilegrid.TileGrid({ resolutions: [360 / 256, 180 / 256, 90 / 256, 45 / 256], - extent: extent, origin: [-180, -180], tileSize: 256 }); goog.base(this, { - extent: extent, projection: ol.proj.get('EPSG:4326'), tileGrid: tileGrid }); From caa0b568ade5f9277df3e2f06e488abbe7bea1e0 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 7 Jul 2014 23:05:12 -0600 Subject: [PATCH 6/6] Remove extent option for sources Most of our uses of source extent were cargo cult programming. The source extent was seldom and inconsistently used. Instead, layers can now be configured with an extent, and layer renderers limit rendering (and data requests) to the layer extent. For vector sources, the `getExtent` method returns the extent of currently loaded features (this was the case before and after this change). For tile based sources, we will likely want to allow easy construction of tile grids based on an extent (this is not possible before or after this change, but could be added later). --- externs/olx.js | 162 +--------------------- src/ol/source/debugtilesource.js | 1 - src/ol/source/formatvectorsource.js | 1 - src/ol/source/imagecanvassource.js | 1 - src/ol/source/imagestaticsource.js | 1 - src/ol/source/imagevectorsource.js | 1 - src/ol/source/imagewmssource.js | 1 - src/ol/source/kmlsource.js | 1 - src/ol/source/mapguidesource.js | 1 - src/ol/source/osmxmlsource.js | 1 - src/ol/source/servervectorsource.js | 1 - src/ol/source/source.js | 25 ---- src/ol/source/staticvectorsource.js | 1 - src/ol/source/tilejsonsource.js | 1 - src/ol/source/tilevectorsource.js | 5 +- src/ol/source/tilewmssource.js | 7 - src/ol/source/vectorsource.js | 2 +- src/ol/source/wmtssource.js | 9 +- src/ol/source/xyzsource.js | 2 - test/spec/ol/source/tilewmssource.test.js | 16 --- 20 files changed, 5 insertions(+), 235 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index 5d03d0b633..44d7f0afee 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -2622,7 +2622,6 @@ olx.source.BingMapsOptions.prototype.tileLoadFunction; /** * @typedef {{attributions: (Array.|undefined), - * extent: (ol.Extent|undefined), * format: ol.format.Feature, * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike}} @@ -2638,13 +2637,6 @@ olx.source.FormatVectorOptions; olx.source.FormatVectorOptions.prototype.attributions; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.FormatVectorOptions.prototype.extent; - - /** * Format. * @type {ol.format.Feature} @@ -2669,7 +2661,6 @@ olx.source.FormatVectorOptions.prototype.projection; /** * @typedef {{attributions: (Array.|undefined), * defaultProjection: ol.proj.ProjectionLike, - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * object: (GeoJSONObject|undefined), * projection: ol.proj.ProjectionLike, @@ -2695,13 +2686,6 @@ olx.source.GeoJSONOptions.prototype.attributions; olx.source.GeoJSONOptions.prototype.defaultProjection; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.GeoJSONOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -2748,7 +2732,6 @@ olx.source.GeoJSONOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * doc: (Document|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * node: (Node|undefined), * projection: ol.proj.ProjectionLike, @@ -2774,13 +2757,6 @@ olx.source.GPXOptions.prototype.attributions; olx.source.GPXOptions.prototype.doc; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.GPXOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -2827,7 +2803,6 @@ olx.source.GPXOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * crossOrigin: (null|string|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * opaque: (boolean|undefined), * projection: ol.proj.ProjectionLike, @@ -2857,13 +2832,6 @@ olx.source.TileImageOptions.prototype.attributions; olx.source.TileImageOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.TileImageOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -2928,7 +2896,6 @@ olx.source.TileImageOptions.prototype.tileUrlFunction; /** * @typedef {{attributions: (Array.|undefined), * defaultProjection: ol.proj.ProjectionLike, - * extent: (ol.Extent|undefined), * format: ol.format.Feature, * logo: (string|olx.LogoOptions|undefined), * object: (GeoJSONObject|undefined), @@ -2956,13 +2923,6 @@ olx.source.TileVectorOptions.prototype.attributions; olx.source.TileVectorOptions.prototype.defaultProjection; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.TileVectorOptions.prototype.extent; - - /** * Format. * @type {ol.format.Feature} @@ -3024,7 +2984,6 @@ olx.source.TileVectorOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * defaultProjection: ol.proj.ProjectionLike, - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * object: (GeoJSONObject|undefined), * projection: ol.proj.ProjectionLike, @@ -3049,13 +3008,6 @@ olx.source.TopoJSONOptions.prototype.attributions; olx.source.TopoJSONOptions.prototype.defaultProjection; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.TopoJSONOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -3144,7 +3096,6 @@ olx.source.IGCOptions.prototype.urls; * @typedef {{url: (string|undefined), * displayDpi: (number|undefined), * metersPerUnit: (number|undefined), - * extent: (ol.Extent|undefined), * hidpi: (boolean|undefined), * useOverlay: (boolean|undefined), * projection: ol.proj.ProjectionLike, @@ -3177,13 +3128,6 @@ olx.source.MapGuideOptions.prototype.displayDpi; olx.source.MapGuideOptions.prototype.metersPerUnit; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.MapGuideOptions.prototype.extent; - - /** * Use the `ol.Map#pixelRatio` value when requesting the image from the remote * server. Default is `true`. @@ -3232,7 +3176,6 @@ olx.source.MapGuideOptions.prototype.params; * @typedef {{attributions: (Array.|undefined), * defaultStyle: (Array.|undefined), * doc: (Document|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * node: (Node|undefined), * projection: ol.proj.ProjectionLike, @@ -3265,13 +3208,6 @@ olx.source.KMLOptions.prototype.defaultStyle; olx.source.KMLOptions.prototype.doc; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.KMLOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -3338,21 +3274,13 @@ olx.source.MapQuestOptions.prototype.tileLoadFunction; /** - * @typedef {{extent: (ol.Extent|undefined), - * projection: ol.proj.ProjectionLike, + * @typedef {{projection: ol.proj.ProjectionLike, * tileGrid: (ol.tilegrid.TileGrid|undefined)}} * @api */ olx.source.TileDebugOptions; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.TileDebugOptions.prototype.extent; - - /** * Projection. * @type {ol.proj.ProjectionLike} @@ -3418,7 +3346,6 @@ olx.source.OSMOptions.prototype.url; * @typedef {{attributions: (Array.|undefined), * defaultStyle: (Array.|undefined), * doc: (Document|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * node: (Node|undefined), * projection: ol.proj.ProjectionLike, @@ -3452,13 +3379,6 @@ olx.source.OSMXMLOptions.prototype.defaultStyle; olx.source.OSMXMLOptions.prototype.doc; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.OSMXMLOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -3511,7 +3431,6 @@ olx.source.OSMXMLOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * canvasFunction: ol.CanvasFunctionType, - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * ratio: (number|undefined), @@ -3543,13 +3462,6 @@ olx.source.ImageCanvasOptions.prototype.attributions; olx.source.ImageCanvasOptions.prototype.canvasFunction; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.ImageCanvasOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -3589,7 +3501,6 @@ olx.source.ImageCanvasOptions.prototype.state; /** * @typedef {{attributions: (Array.|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * ratio: (number|undefined), @@ -3608,13 +3519,6 @@ olx.source.ImageVectorOptions; olx.source.ImageVectorOptions.prototype.attributions; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.ImageVectorOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -3663,7 +3567,6 @@ olx.source.ImageVectorOptions.prototype.style; /** * @typedef {{attributions: (Array.|undefined), * crossOrigin: (null|string|undefined), - * extent: (ol.Extent|undefined), * hidpi: (boolean|undefined), * serverType: (ol.source.wms.ServerType|string|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -3691,13 +3594,6 @@ olx.source.ImageWMSOptions.prototype.attributions; olx.source.ImageWMSOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.ImageWMSOptions.prototype.extent; - - /** * Use the `ol.Map#pixelRatio` value when requesting the image from the remote * server. Default is `true`. @@ -3816,7 +3712,6 @@ olx.source.StamenOptions.prototype.url; /** * @typedef {{attributions: (Array.|undefined), * crossOrigin: (null|string|undefined), - * extent: (ol.Extent|undefined), * imageExtent: (ol.Extent|undefined), * imageSize: (ol.Size|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -3841,13 +3736,6 @@ olx.source.ImageStaticOptions.prototype.attributions; olx.source.ImageStaticOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.ImageStaticOptions.prototype.extent; - - /** * Extent of the image. * @type {ol.Extent|undefined} @@ -3885,7 +3773,6 @@ olx.source.ImageStaticOptions.prototype.url; /** * @typedef {{attributions: (Array.|undefined), - * extent: (ol.Extent|undefined), * format: ol.format.Feature, * loader: function(this: ol.source.ServerVector, ol.Extent, number, ol.proj.Projection), * strategy: (function(ol.Extent, number): Array.|undefined), @@ -3903,13 +3790,6 @@ olx.source.ServerVectorOptions; olx.source.ServerVectorOptions.prototype.attributions; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.ServerVectorOptions.prototype.extent; - - /** * Format. * @type {ol.format.Feature} @@ -3980,7 +3860,6 @@ olx.source.TileJSONOptions.prototype.url; * @typedef {{attributions: (Array.|undefined), * params: Object., * crossOrigin: (null|string|undefined), - * extent: (ol.Extent|undefined), * gutter: (number|undefined), * hidpi: (boolean|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -4019,13 +3898,6 @@ olx.source.TileWMSOptions.prototype.params; olx.source.TileWMSOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.TileWMSOptions.prototype.extent; - - /** * The size in pixels of the gutter around image tiles to ignore. By setting * this property to a non-zero value, images will be requested that are wider @@ -4112,7 +3984,6 @@ olx.source.TileWMSOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), - * extent: (ol.Extent|undefined), * features: (Array.|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, @@ -4129,13 +4000,6 @@ olx.source.VectorOptions; olx.source.VectorOptions.prototype.attributions; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.VectorOptions.prototype.extent; - - /** * Features. * @type {Array.|undefined} @@ -4168,7 +4032,6 @@ olx.source.VectorOptions.prototype.state; * @typedef {{arrayBuffer: (ArrayBuffer|undefined), * attributions: (Array.|undefined), * doc: (Document|undefined), - * extent: (ol.Extent|undefined), * format: ol.format.Feature, * logo: (string|olx.LogoOptions|undefined), * node: (Node|undefined), @@ -4203,13 +4066,6 @@ olx.source.StaticVectorOptions.prototype.attributions; olx.source.StaticVectorOptions.prototype.doc; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.StaticVectorOptions.prototype.extent; - - /** * Format. * @type {ol.format.Feature} @@ -4269,7 +4125,6 @@ olx.source.StaticVectorOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * crossOrigin: (string|null|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * tileGrid: ol.tilegrid.WMTS, * projection: ol.proj.ProjectionLike, @@ -4304,13 +4159,6 @@ olx.source.WMTSOptions.prototype.attributions; olx.source.WMTSOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.WMTSOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} @@ -4422,7 +4270,6 @@ olx.source.WMTSOptions.prototype.urls; /** * @typedef {{attributions: (Array.|undefined), * crossOrigin: (null|string|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * maxZoom: (number|undefined), @@ -4452,13 +4299,6 @@ olx.source.XYZOptions.prototype.attributions; olx.source.XYZOptions.prototype.crossOrigin; -/** - * Extent. - * @type {ol.Extent|undefined} - */ -olx.source.XYZOptions.prototype.extent; - - /** * Logo. * @type{string|olx.LogoOptions|undefined} diff --git a/src/ol/source/debugtilesource.js b/src/ol/source/debugtilesource.js index 999bd81b69..de6c580655 100644 --- a/src/ol/source/debugtilesource.js +++ b/src/ol/source/debugtilesource.js @@ -89,7 +89,6 @@ ol.DebugTile_.prototype.getImage = function(opt_context) { ol.source.TileDebug = function(options) { goog.base(this, { - extent: options.extent, opaque: false, projection: options.projection, tileGrid: options.tileGrid diff --git a/src/ol/source/formatvectorsource.js b/src/ol/source/formatvectorsource.js index 2a5e383145..3911da274f 100644 --- a/src/ol/source/formatvectorsource.js +++ b/src/ol/source/formatvectorsource.js @@ -33,7 +33,6 @@ ol.source.FormatVector = function(options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, logo: options.logo, projection: options.projection }); diff --git a/src/ol/source/imagecanvassource.js b/src/ol/source/imagecanvassource.js index 99fe1365a7..d76e7c7adc 100644 --- a/src/ol/source/imagecanvassource.js +++ b/src/ol/source/imagecanvassource.js @@ -20,7 +20,6 @@ ol.source.ImageCanvas = function(options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, logo: options.logo, projection: options.projection, resolutions: options.resolutions, diff --git a/src/ol/source/imagestaticsource.js b/src/ol/source/imagestaticsource.js index d6d721013d..5eda133275 100644 --- a/src/ol/source/imagestaticsource.js +++ b/src/ol/source/imagestaticsource.js @@ -31,7 +31,6 @@ ol.source.ImageStatic = function(options) { goog.base(this, { attributions: attributions, - extent: options.extent, logo: options.logo, projection: projection, resolutions: [imageResolution] diff --git a/src/ol/source/imagevectorsource.js b/src/ol/source/imagevectorsource.js index d444c51762..4ce73c04cf 100644 --- a/src/ol/source/imagevectorsource.js +++ b/src/ol/source/imagevectorsource.js @@ -75,7 +75,6 @@ ol.source.ImageVector = function(options) { goog.base(this, { attributions: options.attributions, canvasFunction: goog.bind(this.canvasFunctionInternal_, this), - extent: options.extent, logo: options.logo, projection: options.projection, ratio: options.ratio, diff --git a/src/ol/source/imagewmssource.js b/src/ol/source/imagewmssource.js index e7663c90bb..95b9980219 100644 --- a/src/ol/source/imagewmssource.js +++ b/src/ol/source/imagewmssource.js @@ -31,7 +31,6 @@ ol.source.ImageWMS = function(opt_options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, logo: options.logo, projection: options.projection, resolutions: options.resolutions diff --git a/src/ol/source/kmlsource.js b/src/ol/source/kmlsource.js index 8cdfb8f621..27c6e0bd83 100644 --- a/src/ol/source/kmlsource.js +++ b/src/ol/source/kmlsource.js @@ -22,7 +22,6 @@ ol.source.KML = function(opt_options) { goog.base(this, { attributions: options.attributions, doc: options.doc, - extent: options.extent, format: new ol.format.KML({ defaultStyle: options.defaultStyle }), diff --git a/src/ol/source/mapguidesource.js b/src/ol/source/mapguidesource.js index fdd1ce664f..283d4cff71 100644 --- a/src/ol/source/mapguidesource.js +++ b/src/ol/source/mapguidesource.js @@ -21,7 +21,6 @@ goog.require('ol.source.Image'); ol.source.MapGuide = function(options) { goog.base(this, { - extent: options.extent, projection: options.projection, resolutions: options.resolutions }); diff --git a/src/ol/source/osmxmlsource.js b/src/ol/source/osmxmlsource.js index 989786e6f7..dc6dff6c62 100644 --- a/src/ol/source/osmxmlsource.js +++ b/src/ol/source/osmxmlsource.js @@ -22,7 +22,6 @@ ol.source.OSMXML = function(opt_options) { goog.base(this, { attributions: options.attributions, doc: options.doc, - extent: options.extent, format: new ol.format.OSMXML(), logo: options.logo, node: options.node, diff --git a/src/ol/source/servervectorsource.js b/src/ol/source/servervectorsource.js index ac5add8dcc..b2b4f6e873 100644 --- a/src/ol/source/servervectorsource.js +++ b/src/ol/source/servervectorsource.js @@ -23,7 +23,6 @@ ol.source.ServerVector = function(options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, format: options.format, logo: options.logo, projection: options.projection diff --git a/src/ol/source/source.js b/src/ol/source/source.js index a7633ecd9f..b02f016cb0 100644 --- a/src/ol/source/source.js +++ b/src/ol/source/source.js @@ -22,7 +22,6 @@ ol.source.State = { /** * @typedef {{attributions: (Array.|undefined), - * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * state: (ol.source.State|string|undefined)}} @@ -52,14 +51,6 @@ ol.source.Source = function(options) { */ this.projection_ = ol.proj.get(options.projection); - /** - * @private - * @type {ol.Extent} - */ - this.extent_ = goog.isDef(options.extent) ? - options.extent : goog.isDef(options.projection) ? - this.projection_.getExtent() : null; - /** * @private * @type {Array.} @@ -106,14 +97,6 @@ ol.source.Source.prototype.getAttributions = function() { }; -/** - * @return {ol.Extent} Extent. - */ -ol.source.Source.prototype.getExtent = function() { - return this.extent_; -}; - - /** * @return {string|olx.LogoOptions|undefined} Logo. */ @@ -153,14 +136,6 @@ ol.source.Source.prototype.setAttributions = function(attributions) { }; -/** - * @param {ol.Extent} extent Extent. - */ -ol.source.Source.prototype.setExtent = function(extent) { - this.extent_ = extent; -}; - - /** * @param {string|olx.LogoOptions|undefined} logo Logo. */ diff --git a/src/ol/source/staticvectorsource.js b/src/ol/source/staticvectorsource.js index 6f5beffa97..24c2aa7393 100644 --- a/src/ol/source/staticvectorsource.js +++ b/src/ol/source/staticvectorsource.js @@ -22,7 +22,6 @@ ol.source.StaticVector = function(options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, format: options.format, logo: options.logo, projection: options.projection diff --git a/src/ol/source/tilejsonsource.js b/src/ol/source/tilejsonsource.js index 13df6d5989..24c1ba8402 100644 --- a/src/ol/source/tilejsonsource.js +++ b/src/ol/source/tilejsonsource.js @@ -59,7 +59,6 @@ ol.source.TileJSON.prototype.handleTileJSONResponse = function(tileJSON) { var transform = ol.proj.getTransformFromProjections( epsg4326Projection, this.getProjection()); extent = ol.extent.applyTransform(tileJSON.bounds, transform); - this.setExtent(extent); } if (goog.isDef(tileJSON.scheme)) { diff --git a/src/ol/source/tilevectorsource.js b/src/ol/source/tilevectorsource.js index 4637e8a8c4..6b8fb5fd2f 100644 --- a/src/ol/source/tilevectorsource.js +++ b/src/ol/source/tilevectorsource.js @@ -24,7 +24,6 @@ ol.source.TileVector = function(options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, format: options.format, logo: options.logo, projection: options.projection @@ -48,9 +47,7 @@ ol.source.TileVector = function(options) { * @private * @type {ol.TileCoordTransformType} */ - this.tileCoordTransform_ = tileGrid.createTileCoordTransform({ - extent: options.extent - }); + this.tileCoordTransform_ = tileGrid.createTileCoordTransform(); /** * @private diff --git a/src/ol/source/tilewmssource.js b/src/ol/source/tilewmssource.js index 46ea249a5c..d0d4c5c5f6 100644 --- a/src/ol/source/tilewmssource.js +++ b/src/ol/source/tilewmssource.js @@ -40,7 +40,6 @@ ol.source.TileWMS = function(opt_options) { goog.base(this, { attributions: options.attributions, crossOrigin: options.crossOrigin, - extent: options.extent, logo: options.logo, opaque: !transparent, projection: options.projection, @@ -394,12 +393,6 @@ ol.source.TileWMS.prototype.tileUrlFunction_ = tileResolution * gutter, tileExtent); } - var extent = this.getExtent(); - if (!goog.isNull(extent) && (!ol.extent.intersects(tileExtent, extent) || - ol.extent.touches(tileExtent, extent))) { - return undefined; - } - if (pixelRatio != 1) { tileSize = (tileSize * pixelRatio + 0.5) | 0; } diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index e368b5c00a..7353292b24 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -54,7 +54,6 @@ ol.source.Vector = function(opt_options) { goog.base(this, { attributions: options.attributions, - extent: options.extent, logo: options.logo, projection: options.projection, state: options.state @@ -332,6 +331,7 @@ ol.source.Vector.prototype.getClosestFeatureToCoordinate = /** + * Get the extent of the features currently in the source. * @return {ol.Extent} Extent. * @api */ diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js index ec14dc39b3..a9ed21da7f 100644 --- a/src/ol/source/wmtssource.js +++ b/src/ol/source/wmtssource.js @@ -154,13 +154,9 @@ ol.source.WMTS = function(options) { var x = tileCoord.x; var y = -tileCoord.y - 1; var tileExtent = tileGrid.getTileCoordExtent(tileCoord); - var projectionExtent = projection.getExtent(); - var extent = goog.isDef(options.extent) ? - options.extent : projectionExtent; + var extent = projection.getExtent(); - if (!goog.isNull(extent) && projection.isGlobal() && - extent[0] === projectionExtent[0] && - extent[2] === projectionExtent[2]) { + if (!goog.isNull(extent) && projection.isGlobal()) { var numCols = Math.ceil( ol.extent.getWidth(extent) / ol.extent.getWidth(tileExtent)); @@ -181,7 +177,6 @@ ol.source.WMTS = function(options) { goog.base(this, { attributions: options.attributions, crossOrigin: options.crossOrigin, - extent: options.extent, logo: options.logo, projection: options.projection, tileGrid: tileGrid, diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js index faca7ae717..5ccf3bec14 100644 --- a/src/ol/source/xyzsource.js +++ b/src/ol/source/xyzsource.js @@ -30,7 +30,6 @@ ol.source.XYZ = function(options) { goog.base(this, { attributions: options.attributions, crossOrigin: options.crossOrigin, - extent: options.extent, logo: options.logo, projection: projection, tileGrid: tileGrid, @@ -44,7 +43,6 @@ ol.source.XYZ = function(options) { * @type {ol.TileCoordTransformType} */ this.tileCoordTransform_ = tileGrid.createTileCoordTransform({ - extent: options.extent, wrapX: options.wrapX }); diff --git a/test/spec/ol/source/tilewmssource.test.js b/test/spec/ol/source/tilewmssource.test.js index c64247d3fb..d62dee4f46 100644 --- a/test/spec/ol/source/tilewmssource.test.js +++ b/test/spec/ol/source/tilewmssource.test.js @@ -126,22 +126,6 @@ describe('ol.source.TileWMS', function() { expect(queryData.get('BBOX')).to.be('-45,-45,0,0'); }); - it('does not return a tile if it touches layers extent', function() { - options.extent = [-80, -40, -45, -10]; - var source = new ol.source.TileWMS(options); - var tileCoord = new ol.TileCoord(3, 3, 1); - var url = source.tileUrlFunction(tileCoord, 1, ol.proj.get('EPSG:4326')); - expect(url).to.be(undefined); - }); - - it('does not return a tile outside of layers extent', function() { - options.extent = [-80, -40, -45, -10]; - var source = new ol.source.TileWMS(options); - var tileCoord = new ol.TileCoord(3, 4, 2); - var url = source.tileUrlFunction(tileCoord, 1, ol.proj.get('EPSG:4326')); - expect(url).to.be(undefined); - }); - }); describe('#getGetFeatureInfo', function() {