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
+10 -4
View File
@@ -867,7 +867,8 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
* *
* Returns: * Returns:
* {Object} containing properties tilelon, tilelat, tileoffsetlat, * {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) { calculateGridLayout: function(bounds, origin, resolution) {
var tilelon = resolution * this.tileSize.w; var tilelon = resolution * this.tileSize.w;
@@ -894,7 +895,8 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
return { return {
tilelon: tilelon, tilelat: tilelat, tilelon: tilelon, tilelat: tilelat,
tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat, 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) 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); tileoffsetx += Math.round(tileSize.w);
} while ((tileoffsetlon <= bounds.right + tilelon * this.buffer) } while ((tileoffsetlon <= bounds.right + tilelon * this.buffer)
|| colidx < minCols); || colidx < minCols);
tileoffsetlat -= tilelat; tileoffsetlat = 'startrow' in tileLayout ?
origin.lat + (tileLayout.startrow - rowidx) * tilelat :
tileoffsetlat - tilelat;
tileoffsety += Math.round(tileSize.h); tileoffsety += Math.round(tileSize.h);
} while((tileoffsetlat >= bounds.bottom - tilelat * this.buffer) } while((tileoffsetlat >= bounds.bottom - tilelat * this.buffer)
|| rowidx < minRows); || rowidx < minRows);
+12
View File
@@ -533,6 +533,18 @@
map.destroy(); 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> </script>