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).
This commit is contained in:
ahocevar
2012-10-10 12:22:57 +02:00
parent 0b3f582e10
commit d4f011d00c
2 changed files with 22 additions and 4 deletions

View File

@@ -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);

View File

@@ -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();
}
</script>