Correctly generate child tile ranges for XYZ
Instead of incrementing and then doubling, calculate the child tile range by doubling and then incrementing.
With this change, tile coord [0, 0, 0] has the four following children:
[1, 0, 0] [1, 1, 0]
[1, 0, 1] [1, 1, 1]
Without this change, tile coord [0, 0, 0] had the nine following children:
[1, 0, 0] [1, 1, 0] [1, 2, 0]
[1, 0, 1] [1, 1, 1] [1, 2, 1]
[1, 0, 2] [1, 1, 2] [1, 2, 2]
This commit is contained in:
@@ -100,9 +100,11 @@ ol.tilegrid.XYZ.prototype.createTileCoordTransform = function(opt_options) {
|
|||||||
ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange =
|
ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange =
|
||||||
function(tileCoord, opt_tileRange) {
|
function(tileCoord, opt_tileRange) {
|
||||||
if (tileCoord[0] < this.maxZoom) {
|
if (tileCoord[0] < this.maxZoom) {
|
||||||
|
var doubleX = 2 * tileCoord[1];
|
||||||
|
var doubleY = 2 * tileCoord[2];
|
||||||
return ol.TileRange.createOrUpdate(
|
return ol.TileRange.createOrUpdate(
|
||||||
2 * tileCoord[1], 2 * (tileCoord[1] + 1),
|
doubleX, doubleX + 1,
|
||||||
2 * tileCoord[2], 2 * (tileCoord[2] + 1),
|
doubleY, doubleY + 1,
|
||||||
opt_tileRange);
|
opt_tileRange);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -10,6 +10,74 @@ describe('ol.tilegrid.XYZ', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#getTileCoordChildTileRange()', function() {
|
||||||
|
|
||||||
|
it('returns the tile range for one zoom level deeper', function() {
|
||||||
|
var range;
|
||||||
|
|
||||||
|
range = xyzTileGrid.getTileCoordChildTileRange([0, 0, 0]);
|
||||||
|
expect(range.minX).to.be(0);
|
||||||
|
expect(range.maxX).to.be(1);
|
||||||
|
expect(range.minY).to.be(0);
|
||||||
|
expect(range.maxY).to.be(1);
|
||||||
|
|
||||||
|
range = xyzTileGrid.getTileCoordChildTileRange([0, 1, 0]);
|
||||||
|
expect(range.minX).to.be(2);
|
||||||
|
expect(range.maxX).to.be(3);
|
||||||
|
expect(range.minY).to.be(0);
|
||||||
|
expect(range.maxY).to.be(1);
|
||||||
|
|
||||||
|
range = xyzTileGrid.getTileCoordChildTileRange([0, 0, 1]);
|
||||||
|
expect(range.minX).to.be(0);
|
||||||
|
expect(range.maxX).to.be(1);
|
||||||
|
expect(range.minY).to.be(2);
|
||||||
|
expect(range.maxY).to.be(3);
|
||||||
|
|
||||||
|
range = xyzTileGrid.getTileCoordChildTileRange([0, -1, 0]);
|
||||||
|
expect(range.minX).to.be(-2);
|
||||||
|
expect(range.maxX).to.be(-1);
|
||||||
|
expect(range.minY).to.be(0);
|
||||||
|
expect(range.maxY).to.be(1);
|
||||||
|
|
||||||
|
range = xyzTileGrid.getTileCoordChildTileRange([0, 0, -1]);
|
||||||
|
expect(range.minX).to.be(0);
|
||||||
|
expect(range.maxX).to.be(1);
|
||||||
|
expect(range.minY).to.be(-2);
|
||||||
|
expect(range.maxY).to.be(-1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns null for z > maxZoom', function() {
|
||||||
|
var max = xyzTileGrid.maxZoom;
|
||||||
|
var range = xyzTileGrid.getTileCoordChildTileRange([max + 1, 0, 0]);
|
||||||
|
expect(range).to.be(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is like ol.tilegrid.TileGrid#getTileCoordChildTileRange()', function() {
|
||||||
|
var superMethod = ol.tilegrid.TileGrid.prototype
|
||||||
|
.getTileCoordChildTileRange.bind(xyzTileGrid);
|
||||||
|
|
||||||
|
var coord, selfRange, superRange;
|
||||||
|
|
||||||
|
coord = [0, 0, 0];
|
||||||
|
selfRange = xyzTileGrid.getTileCoordChildTileRange(coord);
|
||||||
|
superRange = superMethod(coord);
|
||||||
|
expect(selfRange.minX).to.be(superRange.minX);
|
||||||
|
expect(selfRange.maxX).to.be(superRange.maxX);
|
||||||
|
expect(selfRange.minY).to.be(superRange.minY);
|
||||||
|
expect(selfRange.maxY).to.be(superRange.maxY);
|
||||||
|
|
||||||
|
coord = [1, 2, 3];
|
||||||
|
selfRange = xyzTileGrid.getTileCoordChildTileRange(coord);
|
||||||
|
superRange = superMethod(coord);
|
||||||
|
expect(selfRange.minX).to.be(superRange.minX);
|
||||||
|
expect(selfRange.maxX).to.be(superRange.maxX);
|
||||||
|
expect(selfRange.minY).to.be(superRange.minY);
|
||||||
|
expect(selfRange.maxY).to.be(superRange.maxY);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
describe('forEachTileCoordParentTileRange', function() {
|
describe('forEachTileCoordParentTileRange', function() {
|
||||||
|
|
||||||
it('iterates as expected', function() {
|
it('iterates as expected', function() {
|
||||||
@@ -96,4 +164,5 @@ describe('ol.tilegrid.XYZ', function() {
|
|||||||
|
|
||||||
goog.require('ol.TileCoord');
|
goog.require('ol.TileCoord');
|
||||||
goog.require('ol.TileRange');
|
goog.require('ol.TileRange');
|
||||||
|
goog.require('ol.tilegrid.TileGrid');
|
||||||
goog.require('ol.tilegrid.XYZ');
|
goog.require('ol.tilegrid.XYZ');
|
||||||
|
|||||||
Reference in New Issue
Block a user