From 22bd5fa546af6a9e4f34181290f1784f1af815cc Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 12 Sep 2011 04:26:32 +0000 Subject: [PATCH] also consider the resolutions array if no zoomOffset is provided. r=bartvde (closes #3485) git-svn-id: http://svn.openlayers.org/trunk/openlayers@12357 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Layer.js | 5 ++++- lib/OpenLayers/Layer/Grid.js | 6 +++++- lib/OpenLayers/Layer/XYZ.js | 5 +++-- lib/OpenLayers/Renderer/SVG.js | 8 ++++++++ tests/manual/dateline-sketch.html | 23 +++++++++++++++++------ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 2fb891336d..0dec1ad3b9 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -297,7 +297,10 @@ OpenLayers.Layer = OpenLayers.Class({ /** * APIProperty: wrapDateLine - * {Boolean} #487 for more info. + * {Boolean} Wraps the world at the international dateline, so the map can + * be panned infinitely in longitudinal direction. Only use this on the + * base layer, and only if the layer's maxExtent equals the world bounds. + * #487 for more info. */ wrapDateLine: false, diff --git a/lib/OpenLayers/Layer/Grid.js b/lib/OpenLayers/Layer/Grid.js index 243de05a14..090168ebcb 100644 --- a/lib/OpenLayers/Layer/Grid.js +++ b/lib/OpenLayers/Layer/Grid.js @@ -247,7 +247,11 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { // *partially* contained by our tiles (IE user has // programmatically panned to the other side of the earth) // then we want to reTile (thus, partial true). - // + // + var maxExtent = this.map.getMaxExtent(), + bl = new OpenLayers.LonLat(bounds.left, bounds.bottom).wrapDateLine(maxExtent), + tr = new OpenLayers.LonLat(bounds.right, bounds.top).wrapDateLine(maxExtent); + bounds = new OpenLayers.Bounds(bl.lon, bl.lat, tr.lon, tr.lat); if (forceReTile || !tilesBounds.containsBounds(bounds, true)) { this.initGriddedTiles(bounds); } else { diff --git a/lib/OpenLayers/Layer/XYZ.js b/lib/OpenLayers/Layer/XYZ.js index 86520ab870..ca50152b48 100644 --- a/lib/OpenLayers/Layer/XYZ.js +++ b/lib/OpenLayers/Layer/XYZ.js @@ -144,8 +144,9 @@ OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, { (res * this.tileSize.w)); var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h)); - var z = this.serverResolutions != null ? - OpenLayers.Util.indexOf(this.serverResolutions, res) : + var resolutions = this.serverResolutions || this.resolutions; + var z = this.zoomOffset == 0 ? + OpenLayers.Util.indexOf(resolutions, res) : this.map.getZoom() + this.zoomOffset; var limit = Math.pow(2, z); diff --git a/lib/OpenLayers/Renderer/SVG.js b/lib/OpenLayers/Renderer/SVG.js index f7f53bf08e..aea3bf2be8 100644 --- a/lib/OpenLayers/Renderer/SVG.js +++ b/lib/OpenLayers/Renderer/SVG.js @@ -133,6 +133,14 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, { this.translate(0, 0); return true; } else { + var maxExtent = this.map.getMaxExtent(), + width = maxExtent.getWidth() / resolution; + if (extent.left < maxExtent.left) { + extent.left += width; + } + if (extent.right > maxExtent.right) { + extent.left -= width; + } var inRange = this.translate(left - this.left, top - this.top); if (!inRange) { // recenter the coordinate system diff --git a/tests/manual/dateline-sketch.html b/tests/manual/dateline-sketch.html index 62d4391324..b97e45202f 100644 --- a/tests/manual/dateline-sketch.html +++ b/tests/manual/dateline-sketch.html @@ -22,18 +22,29 @@ var map; function init(){ - map = new OpenLayers.Map('map'); + var maxExtent = new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508), + maxResolution = 156543.0339; + + var options = { + projection: new OpenLayers.Projection("EPSG:900913"), + displayProjection: new OpenLayers.Projection("EPSG:4326"), + units: "m", + numZoomLevels: 18, + maxResolution: maxResolution, + maxExtent: maxExtent + }; + map = new OpenLayers.Map('map', options); - var gmap = new OpenLayers.Layer.Google( - "Google Streets", - {sphericalMercator: true} + var dummy = new OpenLayers.Layer( + "dummy", + {isBaseLayer: true, wrapDateLine: true} ); var vector = new OpenLayers.Layer.Vector("Editable Vectors"); - map.addLayers([gmap, vector]); + map.addLayers([dummy, vector]); map.addControl(new OpenLayers.Control.EditingToolbar(vector)); - var extent = new OpenLayers.Bounds(-24225034.496992, -11368938.517442, -14206280.326992, -1350184.3474418); + var extent = new OpenLayers.Bounds(15849982.183008, -11368938.517442, -14206280.326992, -1350184.3474418); map.zoomToExtent(extent); }