diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 60b5b1df8e..399df2b860 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -100,9 +100,11 @@ ol.tilegrid.XYZ.prototype.createTileCoordTransform = function(opt_options) { ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord, opt_tileRange) { if (tileCoord[0] < this.maxZoom) { + var doubleX = 2 * tileCoord[1]; + var doubleY = 2 * tileCoord[2]; return ol.TileRange.createOrUpdate( - 2 * tileCoord[1], 2 * (tileCoord[1] + 1), - 2 * tileCoord[2], 2 * (tileCoord[2] + 1), + doubleX, doubleX + 1, + doubleY, doubleY + 1, opt_tileRange); } else { return null; diff --git a/test/spec/ol/tilegrid/xyztilegrid.test.js b/test/spec/ol/tilegrid/xyztilegrid.test.js index 042312c120..b82079d354 100644 --- a/test/spec/ol/tilegrid/xyztilegrid.test.js +++ b/test/spec/ol/tilegrid/xyztilegrid.test.js @@ -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() { it('iterates as expected', function() { @@ -96,4 +164,5 @@ describe('ol.tilegrid.XYZ', function() { goog.require('ol.TileCoord'); goog.require('ol.TileRange'); +goog.require('ol.tilegrid.TileGrid'); goog.require('ol.tilegrid.XYZ');