diff --git a/src/ol/layer/TileLayer.js b/src/ol/layer/TileLayer.js index 19af4a20db..28b5b6bfe8 100644 --- a/src/ol/layer/TileLayer.js +++ b/src/ol/layer/TileLayer.js @@ -337,7 +337,18 @@ ol.layer.TileLayer.prototype.getTileForXYZ = function(x, y, z) { .replace('{z}', z + ''); var tile = this.cache_.get(url); if (!goog.isDef(tile)) { - tile = new this.Tile(url); + var tileOrigin = this.getTileOrigin(), + tileOriginX = tileOrigin[0], + tileOriginY = tileOrigin[1]; + var resolution = this.getResolutions()[z]; + var tileWidth = this.tileWidth_ * resolution, + tileHeight = this.tileHeight_ * resolution; + var minX = tileOriginX + (x * tileWidth), + minY = tileOriginY - (y * tileHeight), + maxX = minX + tileWidth, + maxY = minY + tileHeight; + var tileBounds = new ol.Bounds(minX, minY, maxX, maxY); + tile = new this.Tile(url, tileBounds); this.cache_.set(tile.getUrl(), tile); } return tile; @@ -368,13 +379,20 @@ ol.layer.TileLayer.prototype.getData = function(bounds, resolution) { tileOriginY = tileOrigin[1], tileWidthGeo = tileWidth * resolution, - tileHeightGeo = tileHeight * resolution, + tileHeightGeo = tileHeight * resolution; - offsetX = Math.floor( + var extent = this.getExtent(); + if (extent) { + boundsMinX = Math.max(boundsMinX, extent.getMinX()); + boundsMaxX = Math.min(boundsMaxX, extent.getMaxX()); + boundsMinY = Math.max(boundsMinY, extent.getMinY()); + boundsMaxY = Math.min(boundsMaxY, extent.getMaxY()); + } + + var offsetX = Math.floor( (boundsMinX - tileOriginX) / tileWidthGeo), offsetY = Math.floor( (tileOriginY - boundsMaxY) / tileHeightGeo), - gridLeft = tileOriginX + tileWidthGeo * offsetX, gridTop = tileOriginY - tileHeightGeo * offsetY; diff --git a/test/spec/ol/layer/TileLayer.test.js b/test/spec/ol/layer/TileLayer.test.js index 5bd291d6ef..0aa1f59ed3 100644 --- a/test/spec/ol/layer/TileLayer.test.js +++ b/test/spec/ol/layer/TileLayer.test.js @@ -207,6 +207,7 @@ describe('ol.layer.TileLayer', function() { layer.setUrl('/{z}/{x}/{y}'); layer.setResolutions([1, 0.5, 0.25]); layer.setTileOrigin(-128, 128); + layer.setExtent(new ol.Bounds(-128, -128, 128, 128)); }); describe('extent -128,-128,128,128, resolution 1', function() { @@ -225,6 +226,22 @@ describe('ol.layer.TileLayer', function() { }); }); + describe('extent -192,-192,192,192, resolution 1', function() { + + it('returns the expected data', function() { + var tileset = layer.getData( + new ol.Bounds(-192, -192, 192, 192), 1); + + var tiles = tileset.getTiles(); + expect(tiles.length).toEqual(1); + expect(tiles[0].length).toEqual(1); + + var tile = tiles[0][0]; + expect(tile.getUrl()).toEqual('/0/0/0'); + expect(tile.getImg()).toBeDefined(); + }); + }); + describe('extent -128,-128,128,128, resolution 0.5', function() { it('returns the expected data', function() {