Skip to content

Commit 68b51f6

Browse files
committed
fix: Fix rendering tiles that started off-map
When a tiles do not cover the entire map and start off screen, the bookkeeping could load a tile and then the tile could be purged as unneeded by still in the list of "don't check again" and not be loaded when needed. This currently uses an order n operation that could be improved with a dictionary for performance if needed.
1 parent 7894862 commit 68b51f6

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/tileLayer.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,9 @@ var tileLayer = function (arg) {
718718
nTilesLevel = m_this.tilesAtZoom(level);
719719

720720
if (!m_this._options.wrapX) {
721+
if (start.x >= nTilesLevel.x || end.x < 0) {
722+
continue;
723+
}
721724
start.x = Math.min(Math.max(start.x, 0), nTilesLevel.x - 1);
722725
end.x = Math.min(Math.max(end.x, 0), nTilesLevel.x - 1);
723726
if (level === minLevel && m_this._options.keepLower) {
@@ -726,6 +729,9 @@ var tileLayer = function (arg) {
726729
}
727730
}
728731
if (!m_this._options.wrapY) {
732+
if (start.y > nTilesLevel.y || end.y < 0) {
733+
continue;
734+
}
729735
start.y = Math.min(Math.max(start.y, 0), nTilesLevel.y - 1);
730736
end.y = Math.min(Math.max(end.y, 0), nTilesLevel.y - 1);
731737
if (level === minLevel && m_this._options.keepLower) {
@@ -1022,6 +1028,16 @@ var tileLayer = function (arg) {
10221028
}
10231029

10241030
delete m_this._activeTiles[hash];
1031+
if (m_lastTileSet && tile.index) {
1032+
const index = tile.index;
1033+
for (let idx = m_lastTileSet.length - 1; idx >= 0; idx -= 1) {
1034+
const lastTile = m_lastTileSet[idx];
1035+
if (lastTile.level === index.level && lastTile.x === index.x && lastTile.y === index.y && lastTile.reference === index.reference) {
1036+
m_lastTileSet.splice(idx, 1);
1037+
break;
1038+
}
1039+
}
1040+
}
10251041
return value;
10261042
};
10271043

tests/headed-cases/pixelmapLayer.js

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,30 @@ describe('canvasPixelmapLayer', function () {
1919
*
2020
* @param {object} layerParams Optional layer parameters.
2121
*/
22-
function createPixelmap(layerParams) {
23-
var params = geo.util.pixelCoordinateParams('#map', 4096, 4096, 2048, 2048);
22+
function createPixelmap(layerParams, limitedArea) {
23+
var params = geo.util.pixelCoordinateParams(
24+
'#map', limitedArea ? 32768 : 4096, limitedArea ? 32768 : 4096,
25+
2048, 2048);
2426
params.layer.url = '/data/pixelmap_{z}_{x}_{y}.png';
27+
params.layer.keepLower = false;
28+
if (limitedArea) {
29+
params.layer.minLevel = 3;
30+
params.layer.url = (x, y, z) => `../../data/pixelmap_${z - 3}_${y}_${x}.png`;
31+
params.layer.tilesMaxBounds = (level) => {
32+
var scale = Math.pow(2, params.layer.maxLevel - level);
33+
return {
34+
x: Math.floor(4096 / scale),
35+
y: Math.floor(4096 / scale)
36+
};
37+
};
38+
params.layer.tilesAtZoom = (level) => {
39+
var scale = Math.pow(2, params.layer.maxLevel - level);
40+
return {
41+
x: Math.ceil(2 / scale),
42+
y: Math.ceil(2 / scale)
43+
};
44+
};
45+
}
2546
params.layer.data = new Array(5112).fill(0);
2647
params.layer.style = {
2748
color: (d, i) => {
@@ -41,6 +62,10 @@ describe('canvasPixelmapLayer', function () {
4162
}
4263
params.layer.renderer = 'canvas';
4364
map = geo.map(params.map);
65+
if (limitedArea) {
66+
map.zoom(2);
67+
map.center({x: 30000, y: 30000});
68+
}
4469
layer = map.createLayer('pixelmap', params.layer);
4570
map.draw();
4671
}
@@ -117,4 +142,16 @@ describe('canvasPixelmapLayer', function () {
117142
done();
118143
});
119144
});
145+
it('limitedArea', function (done) {
146+
createPixelmap(undefined, true);
147+
map.onIdle(() => {
148+
map.center({x: 0, y: 0});
149+
map.onIdle(() => {
150+
expect(layer instanceof geo.pixelmapLayer).toBe(true);
151+
expect(layer.features().length).toBe(2);
152+
map.center({x: 30000, y: 0});
153+
map.onIdle(done);
154+
});
155+
});
156+
});
120157
});

0 commit comments

Comments
 (0)