Remove tiles outside rendered extent

To avoid having misplaced at alternate resolutions while zooming, all tiles
outside the rendered extent need to be removed from the dom (closes #53).
This commit is contained in:
Tim Schaub
2012-10-07 23:47:47 -06:00
parent d6173a5aac
commit 2c2d40a53c
+12 -18
View File
@@ -34,10 +34,10 @@ ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer, target) {
this.renderedMapResolution_ = undefined; this.renderedMapResolution_ = undefined;
/** /**
* @type {ol.TileRange|undefined} * @type {ol.Extent}
* @private * @private
*/ */
this.renderedTileRange_ = undefined; this.renderedExtent_ = null;
/** /**
* @type {number|undefined} * @type {number|undefined}
@@ -103,26 +103,20 @@ ol.renderer.dom.TileLayer.prototype.removeAltZTiles_ = function() {
/** /**
* Get rid of tiles outside the rendered extent. Only removes tiles at the * Get rid of tiles outside the rendered extent.
* currently rendered z.
* @private * @private
*/ */
ol.renderer.dom.TileLayer.prototype.removeOutOfRangeTiles_ = function() { ol.renderer.dom.TileLayer.prototype.removeOutOfRangeTiles_ = function() {
var tileRange = this.renderedTileRange_; var mapExtent = this.renderedExtent_;
var z = this.renderedZ_; var grid = this.getLayer().getTileSource().getTileGrid();
var key, tileCoord, prune, tile; var key, tileCoord, tileExtent, tile;
for (key in this.renderedTiles_) { for (key in this.renderedTiles_) {
tileCoord = ol.TileCoord.createFromString(key); tileCoord = ol.TileCoord.createFromString(key);
if (tileCoord.z === z) { tileExtent = grid.getTileCoordExtent(tileCoord);
prune = tileCoord.x < tileRange.minX || if (!tileExtent.intersects(mapExtent)) {
tileCoord.x > tileRange.maxX || tile = this.renderedTiles_[key];
tileCoord.y < tileRange.minY || delete this.renderedTiles_[key];
tileCoord.y > tileRange.maxY; goog.dom.removeNode(tile.getImage(this));
if (prune) {
tile = this.renderedTiles_[key];
delete this.renderedTiles_[key];
goog.dom.removeNode(tile.getImage(this));
}
} }
} }
}; };
@@ -308,7 +302,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
goog.dom.appendChild(this.target, fragment); goog.dom.appendChild(this.target, fragment);
} }
this.renderedTileRange_ = tileRange; this.renderedExtent_ = mapExtent;
this.renderedZ_ = z; this.renderedZ_ = z;
this.renderedMapResolution_ = mapResolution; this.renderedMapResolution_ = mapResolution;