From 2cb4306beb3a14b8892c1aabb059fa2ba75c1a42 Mon Sep 17 00:00:00 2001 From: crschmidt Date: Tue, 3 Oct 2006 01:08:00 +0000 Subject: [PATCH] Tiles should not load data outside maxExtent unless the 'displayOutsideMaxExtent' option on the layer is set to true. Add tests, docs, and code. git-svn-id: http://svn.openlayers.org/trunk/openlayers@1531 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- doc/Layer.txt | 1 + lib/OpenLayers/Layer.js | 3 +++ lib/OpenLayers/Tile/Image.js | 18 ++++++++----- lib/OpenLayers/Tile/WFS.js | 5 +++- tests/test_Tile_Image.html | 50 ++++++++++++++++++++++++++++++++++-- 5 files changed, 67 insertions(+), 10 deletions(-) diff --git a/doc/Layer.txt b/doc/Layer.txt index d417bd67c0..cd0fac8743 100644 --- a/doc/Layer.txt +++ b/doc/Layer.txt @@ -22,6 +22,7 @@ of different layers. getViewPortPxFromLonLat({OpenLayers.LonLat|lonlat}) -- {OpenLayers.Pixel} -- Returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, translated into view port pixels * Parameters + displayOutsideMaxExtent -- Determine whether images or data are loaded outside the maxExtent. Default is false. isBaseLayer -- This determines whether the layer is a base layer or an overlay. Only one Base Layer can be displayed on the map at once. Default is false. projection -- SRS string to describe the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map. maxExtent -- an OpenLayers.Bounds for the layer. This is the maximum geographic extent of the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map. diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 59481ee0f0..d956981248 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -78,6 +78,9 @@ OpenLayers.Layer.prototype = { /** @type float */ maxScale: null, + + /** @type Boolean */ + displayOutsideMaxExtent: false, /** diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index cf0e5deb51..8d4f88dc1d 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -49,13 +49,17 @@ OpenLayers.Tile.Image.prototype = } this.imgDiv.style.display = "none"; - if (this.layer.alpha) { - OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv, - null, this.position, this.size, this.url); - } else { - this.imgDiv.src = this.url; - OpenLayers.Util.modifyDOMElement(this.imgDiv, - null, this.position, this.size) ; + if (this.layer.displayOutsideMaxExtent || (this.layer.maxExtent && + (this.bounds.intersectsBounds(this.layer.maxExtent,false)) + )) { + if (this.layer.alpha) { + OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv, + null, this.position, this.size, this.url); + } else { + this.imgDiv.src = this.url; + OpenLayers.Util.modifyDOMElement(this.imgDiv, + null, this.position, this.size) ; + } } }, diff --git a/lib/OpenLayers/Tile/WFS.js b/lib/OpenLayers/Tile/WFS.js index e4b7040f71..215f89d2e5 100644 --- a/lib/OpenLayers/Tile/WFS.js +++ b/lib/OpenLayers/Tile/WFS.js @@ -63,7 +63,10 @@ OpenLayers.Tile.WFS.prototype = this.clear(); } OpenLayers.Tile.prototype.draw.apply(this, arguments); - this.loadFeaturesForRegion(this.requestSuccess); + if (this.layer.displayOutsideMaxExtent || (this.layer.maxExtent && + this.layer.maxExtent.intersectsBounds(this.bounds, false))) { + this.loadFeaturesForRegion(this.requestSuccess); + } }, /** get the full request string from the ds and the tile params diff --git a/tests/test_Tile_Image.html b/tests/test_Tile_Image.html index f22ef2effb..979791ed7b 100644 --- a/tests/test_Tile_Image.html +++ b/tests/test_Tile_Image.html @@ -27,7 +27,7 @@ function test_02_Tile_Image_draw (t) { t.plan( 5 ); - var layer = new Object(); //bogus layer + var layer = {maxExtent:new OpenLayers.Bounds(-180,-90,180,90)}; //bogus layer layer.div = document.createElement("div"); var position = new OpenLayers.Pixel(20,30); var bounds = new OpenLayers.Bounds(1,2,3,4); @@ -51,11 +51,57 @@ t.eq( tile.imgDiv.style.width, "5px", "Image width is correct" ); t.eq( tile.imgDiv.style.height, "6px", "Image height is correct" ); } - + function test_03_Tile_Image_OutsideMaxExtent(t) { + t.plan( 11 ); + var position = new OpenLayers.Pixel(20,30); + var bounds = new OpenLayers.Bounds(1,2,3,4); + var url = "http://www.openlayers.org/dev/tests/tileimage"; + var size = new OpenLayers.Size(5,6); + var map = new OpenLayers.Map('map'); + var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", + "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); + map.addLayer(layer); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-90,-180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "", "Images against side of maxextent don't load"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-91,180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Images over edges of maxextent do load"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-90,180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Images over edges of maxextent do load"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-180,-90,180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering all of extent loads"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-80,-45,80,45), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering small part of extent loads"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-95,185,95), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering more than all of extent loads"); + + layer.displayOutsideMaxExtent=1; + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-90,-180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Images against side of maxextent do load with displayOutsideMaxExtent"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-90,180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Images over edges of maxextent do load with displayOutsideMaxExtent set"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-180,-90,180,90), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering all of extent loads with display outside max extent"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-80,-45,80,45), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering small part of extent loads with display outside max extent"); + tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-95,185,95), url, size); + tile.draw() + t.eq(tile.imgDiv.src, "http://www.openlayers.org/dev/tests/tileimage", "Image covering more than all of extent loads"); + } // --> +