From ce1b99cb56984f8588be8d6468d05d46c6476f76 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 9 Oct 2012 22:56:37 -0600 Subject: [PATCH 1/4] Remove alt-z tiles when all tiles load at target z The changes in a14a15159fb93e6ad75df3abd9ad6748c67d50e1 made it so tiles at alternate resolutions were not pruned when target tiles finished loading. --- src/ol/renderer/dom/tilelayer.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ol/renderer/dom/tilelayer.js b/src/ol/renderer/dom/tilelayer.js index d03d3eee2d..24de2b5eac 100644 --- a/src/ol/renderer/dom/tilelayer.js +++ b/src/ol/renderer/dom/tilelayer.js @@ -111,6 +111,22 @@ ol.renderer.dom.TileLayer.prototype.handleTileChange_ = function(event) { var key = tileCoord.toString(); delete this.loadingTiles_[key]; } + var loaded = true; + for (var key in this.loadingTiles_) { + loaded = false; + break; + } + if (loaded) { + var z = this.renderedZ_; + for (var key in this.renderedTiles_) { + tileCoord = ol.TileCoord.createFromString(key); + if (tileCoord.z !== z) { + tile = this.renderedTiles_[key]; + delete this.renderedTiles_[key]; + goog.dom.removeNode(tile.getImage(this)); + } + } + } }; From f8462460bf82f46484149d52822d62a6ab660cfc Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 9 Oct 2012 23:31:38 -0600 Subject: [PATCH 2/4] Two lessons learned Telling the compiler that object keys are numeric causes more harm than good (see === comparison that could never be met though the compiler didn't catch it). Never use goog functions without reading the source first. The goog.array.sort method does nothing special sorting numeric strings (so the zs array might be ['1', '10', '2'] here). --- src/ol/renderer/dom/tilelayer.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ol/renderer/dom/tilelayer.js b/src/ol/renderer/dom/tilelayer.js index 24de2b5eac..67f2199460 100644 --- a/src/ol/renderer/dom/tilelayer.js +++ b/src/ol/renderer/dom/tilelayer.js @@ -169,10 +169,10 @@ ol.renderer.dom.TileLayer.prototype.render = function() { } /** - * @type {Object.>} + * @type {Object.>} */ var tilesToDrawByZ = {}; - tilesToDrawByZ[z] = {}; + tilesToDrawByZ[String(z)] = {}; var tileRange = tileGrid.getTileRangeForExtentAndResolution(mapExtent, mapResolution); @@ -188,7 +188,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() { var key = tile.tileCoord.toString(); if (tile.getState() == ol.TileState.LOADED) { - tilesToDrawByZ[z][key] = tile; + tilesToDrawByZ[String(z)][key] = tile; return; } else { if (!(key in this.loadingTiles_)) { @@ -198,7 +198,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() { tile.load(); } // TODO: only append after load? - tilesToDrawByZ[z][key] = tile; + tilesToDrawByZ[String(z)][key] = tile; } /** @@ -210,10 +210,12 @@ ol.renderer.dom.TileLayer.prototype.render = function() { tileGrid.forEachTileCoordParentTileRange( tileCoord, function(altZ, altTileRange) { + altZ = String(altZ); var fullyCovered = true; altTileRange.forEachTileCoord(altZ, function(altTileCoord) { var tileKey = altTileCoord.toString(); - if (tilesToDrawByZ[altZ] && tilesToDrawByZ[altZ][tileKey]) { + if (tilesToDrawByZ[altZ] && + tilesToDrawByZ[altZ][tileKey]) { return; } var altTile = tileSource.getTile(altTileCoord); @@ -232,17 +234,16 @@ ol.renderer.dom.TileLayer.prototype.render = function() { }, this); - /** @type {Array.} */ var zs = goog.object.getKeys(tilesToDrawByZ); - goog.array.sort(zs); + zs.sort(function(a, b) {return a - b}); var fragment = document.createDocumentFragment(); var altFragment = document.createDocumentFragment(); var newTiles = false; var newAltTiles = false; for (var i = 0, ii = zs.length; i < ii; ++i) { - var tileZ = zs[i]; - var tilesToDraw = tilesToDrawByZ[tileZ]; + var tileZ = +zs[i]; + var tilesToDraw = tilesToDrawByZ[String(tileZ)]; var tileOffset = this.getTileOffset_(tileZ, mapResolution); for (var key in tilesToDraw) { var tile = tilesToDraw[key]; From ac8dd5db98a225b8dda37845fca6fc9f19906ea0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 10 Oct 2012 10:27:35 +0200 Subject: [PATCH 3/4] Fix sort problem identified by @tschaub in f8462460bf82f46484149d52822d62a6ab660cfc --- src/ol/renderer/webgl/tilelayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/renderer/webgl/tilelayer.js b/src/ol/renderer/webgl/tilelayer.js index cadd8c893f..3b6930d164 100644 --- a/src/ol/renderer/webgl/tilelayer.js +++ b/src/ol/renderer/webgl/tilelayer.js @@ -455,7 +455,7 @@ ol.renderer.webgl.TileLayer.prototype.render = function() { }, this); /** @type {Array.} */ - var zs = goog.object.getKeys(tilesToDrawByZ); + var zs = goog.object.getKeys(tilesToDrawByZ).map(Number); goog.array.sort(zs); var uTileOffset = goog.vec.Vec4.createFloat32(); goog.array.forEach(zs, function(z) { From 936584ceaa52f1258e5028716f46b0e5a042d9ba Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 10 Oct 2012 13:49:01 +0200 Subject: [PATCH 4/4] Use goog.array.map for browser compatability, thanks @AugustusKling --- src/ol/renderer/webgl/tilelayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/renderer/webgl/tilelayer.js b/src/ol/renderer/webgl/tilelayer.js index 3b6930d164..d200ad5589 100644 --- a/src/ol/renderer/webgl/tilelayer.js +++ b/src/ol/renderer/webgl/tilelayer.js @@ -455,7 +455,7 @@ ol.renderer.webgl.TileLayer.prototype.render = function() { }, this); /** @type {Array.} */ - var zs = goog.object.getKeys(tilesToDrawByZ).map(Number); + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); goog.array.sort(zs); var uTileOffset = goog.vec.Vec4.createFloat32(); goog.array.forEach(zs, function(z) {