Make TileGrid behave as documented with extent and sizes options

This commit is contained in:
Andreas Hocevar
2020-09-07 11:07:12 +02:00
parent da5e4ffbb6
commit 0f8c8af833
4 changed files with 54 additions and 12 deletions

View File

@@ -76,13 +76,7 @@ export function withinExtentAndZ(tileCoord, tileGrid) {
if (tileGrid.getMinZoom() > z || z > tileGrid.getMaxZoom()) { if (tileGrid.getMinZoom() > z || z > tileGrid.getMaxZoom()) {
return false; return false;
} }
const extent = tileGrid.getExtent(); const tileRange = tileGrid.getFullTileRange(z);
let tileRange;
if (!extent) {
tileRange = tileGrid.getFullTileRange(z);
} else {
tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
}
if (!tileRange) { if (!tileRange) {
return true; return true;
} else { } else {

View File

@@ -188,6 +188,13 @@ class TileGrid {
Math.min(0, size[1]), Math.min(0, size[1]),
Math.max(size[1] - 1, -1) Math.max(size[1] - 1, -1)
); );
if (extent) {
const restrictedTileRange = this.getTileRangeForExtentAndZ(extent, z);
tileRange.minX = Math.max(restrictedTileRange.minX, tileRange.minX);
tileRange.maxX = Math.min(restrictedTileRange.maxX, tileRange.maxX);
tileRange.minY = Math.max(restrictedTileRange.minY, tileRange.minY);
tileRange.maxY = Math.min(restrictedTileRange.maxY, tileRange.maxY);
}
return tileRange; return tileRange;
}, this); }, this);
} else if (extent) { } else if (extent) {
@@ -566,7 +573,9 @@ class TileGrid {
*/ */
getFullTileRange(z) { getFullTileRange(z) {
if (!this.fullTileRanges_) { if (!this.fullTileRanges_) {
return null; return this.extent_
? this.getTileRangeForExtentAndZ(this.extent_, z)
: null;
} else { } else {
return this.fullTileRanges_[z]; return this.fullTileRanges_[z];
} }

View File

@@ -57,7 +57,7 @@ describe('ol.TileCoord', function () {
it('restricts by extent when extent defines tile ranges', function () { it('restricts by extent when extent defines tile ranges', function () {
const tileGrid = new TileGrid({ const tileGrid = new TileGrid({
extent: [10, 20, 30, 40], extent: [10, 20, 30, 40],
sizes: [[3, -3]], sizes: [[3, 3]],
tileSize: 10, tileSize: 10,
resolutions: [1], resolutions: [1],
}); });

View File

@@ -210,6 +210,26 @@ describe('ol.tilegrid.TileGrid', function () {
}); });
}); });
describe('create with sizes', function () {
let tileGrid;
beforeEach(function () {
tileGrid = new TileGrid({
origin: [10, 40],
sizes: [[3, 3]],
tileSize: 10,
resolutions: [1],
});
});
it('calculates full tile ranges from sizes', function () {
const fullTileRange = tileGrid.getFullTileRange(0);
expect(fullTileRange.minX).to.equal(0);
expect(fullTileRange.maxX).to.equal(2);
expect(fullTileRange.minY).to.equal(0);
expect(fullTileRange.maxY).to.equal(2);
});
});
describe('create with extent and sizes', function () { describe('create with extent and sizes', function () {
let tileGrid; let tileGrid;
beforeEach(function () { beforeEach(function () {
@@ -225,12 +245,31 @@ describe('ol.tilegrid.TileGrid', function () {
expect(tileGrid.getExtent()).to.eql([10, 20, 30, 40]); expect(tileGrid.getExtent()).to.eql([10, 20, 30, 40]);
}); });
it('calculates full tile ranges from sizes', function () { it('calculates full tile ranges from sizes, further limited by extent', function () {
const fullTileRange = tileGrid.getFullTileRange(0); const fullTileRange = tileGrid.getFullTileRange(0);
expect(fullTileRange.minX).to.equal(0); expect(fullTileRange.minX).to.equal(0);
expect(fullTileRange.maxX).to.equal(2); expect(fullTileRange.maxX).to.equal(1);
expect(fullTileRange.minY).to.equal(0); expect(fullTileRange.minY).to.equal(0);
expect(fullTileRange.maxY).to.equal(2); expect(fullTileRange.maxY).to.equal(1);
});
});
describe('create with extent', function () {
let tileGrid;
beforeEach(function () {
tileGrid = new TileGrid({
extent: [10, 20, 30, 40],
tileSize: 10,
resolutions: [1],
});
});
it('calculates full tile ranges from extent', function () {
const fullTileRange = tileGrid.getFullTileRange(0);
expect(fullTileRange.minX).to.equal(0);
expect(fullTileRange.maxX).to.equal(1);
expect(fullTileRange.minY).to.equal(0);
expect(fullTileRange.maxY).to.equal(1);
}); });
}); });