From d4f011d00cb9256b2b37eee44b34978cf6ea353b Mon Sep 17 00:00:00 2001 From: ahocevar Date: Wed, 10 Oct 2012 12:22:57 +0200 Subject: [PATCH] Absolute calculation of tile bounds This avoids cumulated tile bounds errors for layer types that do not use a tile row/column index in requests (e.g. WMS). --- lib/OpenLayers/Layer/Grid.js | 14 ++++++++++---- tests/Layer/WMS.html | 12 ++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/OpenLayers/Layer/Grid.js b/lib/OpenLayers/Layer/Grid.js index fcb2b42e64..bc1d36cb0e 100644 --- a/lib/OpenLayers/Layer/Grid.js +++ b/lib/OpenLayers/Layer/Grid.js @@ -867,7 +867,8 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { * * Returns: * {Object} containing properties tilelon, tilelat, tileoffsetlat, - * tileoffsetlat, tileoffsetx, tileoffsety + * tileoffsetlat, tileoffsetx, tileoffsety and optional startrow, startcol + * for grid layouts where absolute tile bounds calculation is possible. */ calculateGridLayout: function(bounds, origin, resolution) { var tilelon = resolution * this.tileSize.w; @@ -894,7 +895,8 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { return { tilelon: tilelon, tilelat: tilelat, tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat, - tileoffsetx: tileoffsetx, tileoffsety: tileoffsety + tileoffsetx: tileoffsetx, tileoffsety: tileoffsety, + startcol: tilecol, startrow: tilerow }; }, @@ -1012,12 +1014,16 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { Math.pow(tileCenter.lat - center.lat, 2) }); - tileoffsetlon += tilelon; + tileoffsetlon = 'startcol' in tileLayout ? + origin.lon + (tileLayout.startcol + colidx) * tilelon : + tileoffsetlon + tilelon; tileoffsetx += Math.round(tileSize.w); } while ((tileoffsetlon <= bounds.right + tilelon * this.buffer) || colidx < minCols); - tileoffsetlat -= tilelat; + tileoffsetlat = 'startrow' in tileLayout ? + origin.lat + (tileLayout.startrow - rowidx) * tilelat : + tileoffsetlat - tilelat; tileoffsety += Math.round(tileSize.h); } while((tileoffsetlat >= bounds.bottom - tilelat * this.buffer) || rowidx < minRows); diff --git a/tests/Layer/WMS.html b/tests/Layer/WMS.html index 0e9fb9a8fc..fc292b809e 100644 --- a/tests/Layer/WMS.html +++ b/tests/Layer/WMS.html @@ -533,6 +533,18 @@ map.destroy(); } + + function test_tileBounds(t) { + t.plan(1); + var map = new OpenLayers.Map("map", {projection: "EPSG:3857"}); + var layer = new OpenLayers.Layer.WMS("wms", "../../img/blank.gif"); + map.addLayer(layer); + map.setCenter([0, 0], 1); + map.pan(2, -100); + map.zoomIn(); + t.eq(layer.grid[1][0].bounds, new OpenLayers.Bounds(-10018754.17, 0, 0, 10018754.17), "no floating point errors"); + map.destroy(); + }