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).
This commit is contained in:
Tim Schaub
2012-10-09 23:31:38 -06:00
parent ce1b99cb56
commit f8462460bf
+10 -9
View File
@@ -169,10 +169,10 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
} }
/** /**
* @type {Object.<number, Object.<string, ol.Tile>>} * @type {Object.<string, Object.<string, ol.Tile>>}
*/ */
var tilesToDrawByZ = {}; var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {}; tilesToDrawByZ[String(z)] = {};
var tileRange = var tileRange =
tileGrid.getTileRangeForExtentAndResolution(mapExtent, mapResolution); tileGrid.getTileRangeForExtentAndResolution(mapExtent, mapResolution);
@@ -188,7 +188,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
var key = tile.tileCoord.toString(); var key = tile.tileCoord.toString();
if (tile.getState() == ol.TileState.LOADED) { if (tile.getState() == ol.TileState.LOADED) {
tilesToDrawByZ[z][key] = tile; tilesToDrawByZ[String(z)][key] = tile;
return; return;
} else { } else {
if (!(key in this.loadingTiles_)) { if (!(key in this.loadingTiles_)) {
@@ -198,7 +198,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
tile.load(); tile.load();
} }
// TODO: only append after 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( tileGrid.forEachTileCoordParentTileRange(
tileCoord, tileCoord,
function(altZ, altTileRange) { function(altZ, altTileRange) {
altZ = String(altZ);
var fullyCovered = true; var fullyCovered = true;
altTileRange.forEachTileCoord(altZ, function(altTileCoord) { altTileRange.forEachTileCoord(altZ, function(altTileCoord) {
var tileKey = altTileCoord.toString(); var tileKey = altTileCoord.toString();
if (tilesToDrawByZ[altZ] && tilesToDrawByZ[altZ][tileKey]) { if (tilesToDrawByZ[altZ] &&
tilesToDrawByZ[altZ][tileKey]) {
return; return;
} }
var altTile = tileSource.getTile(altTileCoord); var altTile = tileSource.getTile(altTileCoord);
@@ -232,17 +234,16 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
}, this); }, this);
/** @type {Array.<number>} */
var zs = goog.object.getKeys(tilesToDrawByZ); var zs = goog.object.getKeys(tilesToDrawByZ);
goog.array.sort(zs); zs.sort(function(a, b) {return a - b});
var fragment = document.createDocumentFragment(); var fragment = document.createDocumentFragment();
var altFragment = document.createDocumentFragment(); var altFragment = document.createDocumentFragment();
var newTiles = false; var newTiles = false;
var newAltTiles = false; var newAltTiles = false;
for (var i = 0, ii = zs.length; i < ii; ++i) { for (var i = 0, ii = zs.length; i < ii; ++i) {
var tileZ = zs[i]; var tileZ = +zs[i];
var tilesToDraw = tilesToDrawByZ[tileZ]; var tilesToDraw = tilesToDrawByZ[String(tileZ)];
var tileOffset = this.getTileOffset_(tileZ, mapResolution); var tileOffset = this.getTileOffset_(tileZ, mapResolution);
for (var key in tilesToDraw) { for (var key in tilesToDraw) {
var tile = tilesToDraw[key]; var tile = tilesToDraw[key];