Fix return from findLoadedTiles
Previously, the findInterimTiles method was returning undefined if the min x/y coord for a tile range was already in the lookup. The return says it indicates whether all tiles for the given z are loaded. This change corrects the return. This change also reveals a misunderstanding of the tile range returned by `getTileRangeForExtentAndZ`. The previous findInterimTiles method was treating max values as inclusive. This is intuitive. It looks like the method returns a range where max values are exclusive.
This commit is contained in:
@@ -75,12 +75,13 @@ ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ, z,
|
|||||||
// FIXME this could be more efficient about filling partial holes
|
// FIXME this could be more efficient about filling partial holes
|
||||||
var fullyCovered = true;
|
var fullyCovered = true;
|
||||||
var tile, tileCoord, tileCoordKey, x, y;
|
var tile, tileCoord, tileCoordKey, x, y;
|
||||||
|
// TODO: tile range is misunderstood (inclusive or not?)
|
||||||
for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
|
for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
|
||||||
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
|
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
|
||||||
tileCoord = new ol.TileCoord(z, x, y);
|
tileCoord = new ol.TileCoord(z, x, y);
|
||||||
tileCoordKey = tileCoord.toString();
|
tileCoordKey = tileCoord.toString();
|
||||||
if (loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) {
|
if (loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) {
|
||||||
return false; // TODO: fix this
|
continue;
|
||||||
}
|
}
|
||||||
tile = this.getTile(tileCoord);
|
tile = this.getTile(tileCoord);
|
||||||
if (!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED) {
|
if (!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED) {
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ describe('ol.source.TileSource', function() {
|
|||||||
it('adds loaded tiles to the lookup (z: 0)', function() {
|
it('adds loaded tiles to the lookup (z: 0)', function() {
|
||||||
// a source with no loaded tiles
|
// a source with no loaded tiles
|
||||||
var source = new ol.test.source.MockTileSource({
|
var source = new ol.test.source.MockTileSource({
|
||||||
'0/0/-1': true,
|
'0/0/0': true,
|
||||||
'1/0/-1': true
|
'1/0/0': true
|
||||||
});
|
});
|
||||||
|
|
||||||
var loadedTilesByZ = {};
|
var loadedTilesByZ = {};
|
||||||
@@ -40,7 +40,7 @@ describe('ol.source.TileSource', function() {
|
|||||||
source.findLoadedTiles(loadedTilesByZ, 0, range);
|
source.findLoadedTiles(loadedTilesByZ, 0, range);
|
||||||
var keys = goog.object.getKeys(loadedTilesByZ);
|
var keys = goog.object.getKeys(loadedTilesByZ);
|
||||||
expect(keys.length).toBe(1);
|
expect(keys.length).toBe(1);
|
||||||
var tile = loadedTilesByZ['0']['0/0/-1'];
|
var tile = loadedTilesByZ['0']['0/0/0'];
|
||||||
expect(tile).toBeA(ol.Tile);
|
expect(tile).toBeA(ol.Tile);
|
||||||
expect(tile.state).toBe(ol.TileState.LOADED);
|
expect(tile.state).toBe(ol.TileState.LOADED);
|
||||||
});
|
});
|
||||||
@@ -48,8 +48,8 @@ describe('ol.source.TileSource', function() {
|
|||||||
it('adds loaded tiles to the lookup (z: 1)', function() {
|
it('adds loaded tiles to the lookup (z: 1)', function() {
|
||||||
// a source with no loaded tiles
|
// a source with no loaded tiles
|
||||||
var source = new ol.test.source.MockTileSource({
|
var source = new ol.test.source.MockTileSource({
|
||||||
'0/0/-1': true,
|
'0/0/0': true,
|
||||||
'1/0/-1': true
|
'1/0/0': true
|
||||||
});
|
});
|
||||||
|
|
||||||
var loadedTilesByZ = {};
|
var loadedTilesByZ = {};
|
||||||
@@ -58,11 +58,100 @@ describe('ol.source.TileSource', function() {
|
|||||||
source.findLoadedTiles(loadedTilesByZ, 1, range);
|
source.findLoadedTiles(loadedTilesByZ, 1, range);
|
||||||
var keys = goog.object.getKeys(loadedTilesByZ);
|
var keys = goog.object.getKeys(loadedTilesByZ);
|
||||||
expect(keys.length).toBe(1);
|
expect(keys.length).toBe(1);
|
||||||
var tile = loadedTilesByZ['1']['1/0/-1'];
|
var tile = loadedTilesByZ['1']['1/0/0'];
|
||||||
expect(tile).toBeA(ol.Tile);
|
expect(tile).toBeA(ol.Tile);
|
||||||
expect(tile.state).toBe(ol.TileState.LOADED);
|
expect(tile.state).toBe(ol.TileState.LOADED);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns true when all tiles are already loaded', function() {
|
||||||
|
// a source with no loaded tiles
|
||||||
|
var source = new ol.test.source.MockTileSource({
|
||||||
|
// TODO: tile range is misunderstood
|
||||||
|
'1/0/0': true,
|
||||||
|
'1/0/1': true,
|
||||||
|
'1/0/2': true,
|
||||||
|
'1/1/0': true,
|
||||||
|
'1/1/1': true,
|
||||||
|
'1/1/2': true,
|
||||||
|
'1/2/0': true,
|
||||||
|
'1/2/1': true,
|
||||||
|
'1/2/2': true,
|
||||||
|
});
|
||||||
|
|
||||||
|
var loadedTilesByZ = {};
|
||||||
|
var grid = source.getTileGrid();
|
||||||
|
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
|
||||||
|
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range);
|
||||||
|
expect(allLoaded).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns true when all tiles are already loaded (part 2)', function() {
|
||||||
|
// a source with no loaded tiles
|
||||||
|
var source = new ol.test.source.MockTileSource({});
|
||||||
|
|
||||||
|
var loadedTilesByZ = {
|
||||||
|
'1': {
|
||||||
|
'1/0/0': true,
|
||||||
|
'1/0/1': true,
|
||||||
|
'1/0/2': true,
|
||||||
|
'1/1/0': true,
|
||||||
|
'1/1/1': true,
|
||||||
|
'1/1/2': true,
|
||||||
|
'1/2/0': true,
|
||||||
|
'1/2/1': true,
|
||||||
|
'1/2/2': true,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var grid = source.getTileGrid();
|
||||||
|
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
|
||||||
|
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range);
|
||||||
|
expect(allLoaded).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false when all tiles are already loaded', function() {
|
||||||
|
// a source with no loaded tiles
|
||||||
|
var source = new ol.test.source.MockTileSource({
|
||||||
|
'1/0/0': true,
|
||||||
|
'1/0/1': true,
|
||||||
|
'1/0/2': true,
|
||||||
|
'1/1/0': true,
|
||||||
|
'1/1/1': false,
|
||||||
|
'1/1/2': true,
|
||||||
|
'1/2/0': true,
|
||||||
|
'1/2/1': true,
|
||||||
|
'1/2/2': true,
|
||||||
|
});
|
||||||
|
|
||||||
|
var loadedTilesByZ = {};
|
||||||
|
var grid = source.getTileGrid();
|
||||||
|
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
|
||||||
|
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range);
|
||||||
|
expect(allLoaded).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false when all tiles are already loaded (part 2)', function() {
|
||||||
|
// a source with no loaded tiles
|
||||||
|
var source = new ol.test.source.MockTileSource({});
|
||||||
|
|
||||||
|
var loadedTilesByZ = {
|
||||||
|
'1': {
|
||||||
|
'1/0/0': true,
|
||||||
|
'1/0/1': true,
|
||||||
|
'1/0/2': true,
|
||||||
|
'1/1/0': true,
|
||||||
|
'1/1/1': false,
|
||||||
|
'1/1/2': true,
|
||||||
|
'1/2/0': true,
|
||||||
|
'1/2/1': true,
|
||||||
|
'1/2/2': true,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var grid = source.getTileGrid();
|
||||||
|
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
|
||||||
|
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range);
|
||||||
|
expect(allLoaded).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -80,7 +169,7 @@ ol.test.source.MockTileSource = function(loaded) {
|
|||||||
var tileGrid = new ol.tilegrid.TileGrid({
|
var tileGrid = new ol.tilegrid.TileGrid({
|
||||||
resolutions: [360 / 256, 180 / 256, 90 / 256, 45 / 256],
|
resolutions: [360 / 256, 180 / 256, 90 / 256, 45 / 256],
|
||||||
extent: extent,
|
extent: extent,
|
||||||
origin: new ol.Coordinate(-180, 180),
|
origin: new ol.Coordinate(-180, -180),
|
||||||
tileSize: new ol.Size(256, 256)
|
tileSize: new ol.Size(256, 256)
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -127,7 +216,7 @@ describe('ol.test.source.MockTileSource', function() {
|
|||||||
it('returns a tile with state based on constructor arg', function() {
|
it('returns a tile with state based on constructor arg', function() {
|
||||||
var source = new ol.test.source.MockTileSource({
|
var source = new ol.test.source.MockTileSource({
|
||||||
'0/0/0': true,
|
'0/0/0': true,
|
||||||
'1/0/-1': true
|
'1/0/0': true
|
||||||
});
|
});
|
||||||
var tile;
|
var tile;
|
||||||
|
|
||||||
@@ -142,7 +231,7 @@ describe('ol.test.source.MockTileSource', function() {
|
|||||||
expect(tile.state).toBe(ol.TileState.IDLE);
|
expect(tile.state).toBe(ol.TileState.IDLE);
|
||||||
|
|
||||||
// check another loaded tile
|
// check another loaded tile
|
||||||
tile = source.getTile(new ol.TileCoord(1, 0, -1));
|
tile = source.getTile(new ol.TileCoord(1, 0, 0));
|
||||||
expect(tile).toBeA(ol.Tile);
|
expect(tile).toBeA(ol.Tile);
|
||||||
expect(tile.state).toBe(ol.TileState.LOADED);
|
expect(tile.state).toBe(ol.TileState.LOADED);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user