diff --git a/src/ol/extent.js b/src/ol/extent.js index 9627ea29a1..078e8397fc 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -337,6 +337,19 @@ ol.extent.toString = function(extent) { }; +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {boolean} Touches. + */ +ol.extent.touches = function(extent1, extent2) { + var intersects = ol.extent.intersects(extent1, extent2); + return intersects && + (extent1[0] == extent2[2] || extent1[2] == extent2[0] || + extent1[1] == extent2[3] || extent1[3] == extent2[1]); +}; + + /** * @param {ol.Extent} extent Extent. * @param {ol.TransformFunction} transformFn Transform function. diff --git a/src/ol/source/tilewmssource.js b/src/ol/source/tilewmssource.js index 7faa7244b7..6f582b039c 100644 --- a/src/ol/source/tilewmssource.js +++ b/src/ol/source/tilewmssource.js @@ -84,7 +84,8 @@ ol.source.TileWMS = function(options) { tileExtent = tileGrid.getTileCoordExtent( new ol.TileCoord(tileCoord.z, x, tileCoord.y)); } - if (!goog.isNull(extent) && !ol.extent.intersects(tileExtent, extent)) { + if (!goog.isNull(extent) && (!ol.extent.intersects(tileExtent, extent) || + ol.extent.touches(tileExtent, extent))) { return null; } return new ol.TileCoord(tileCoord.z, x, tileCoord.y); diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js index d0ddb75e40..47a64fa2f5 100644 --- a/src/ol/source/wmtssource.js +++ b/src/ol/source/wmtssource.js @@ -165,7 +165,8 @@ ol.source.WMTS = function(options) { tmpTileCoord.y = tileCoord.y; tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent); } - if (!ol.extent.intersects(tileExtent, extent)) { + if (!ol.extent.intersects(tileExtent, extent) || + ol.extent.touches(tileExtent, extent)) { return null; } return new ol.TileCoord(tileCoord.z, x, y); diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index c4a9a1dbeb..2aaba7c351 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -122,7 +122,7 @@ describe('ol.extent', function() { }); }); - describe('intersect', function() { + describe('intersects', function() { it('returns the expected value', function() { var intersects = ol.extent.intersects; @@ -157,6 +157,23 @@ describe('ol.extent', function() { }); }); + describe('touches', function() { + + it('returns the expected value', function() { + var touches = ol.extent.touches; + var extent = [50, 50, 100, 100]; + expect(touches(extent, [20, 20, 80, 80])).to.be(false); + expect(touches(extent, [20, 20, 50, 80])).to.be(true); + expect(touches(extent, [20, 20, 50, 40])).to.be(false); + expect(touches(extent, [100, 20, 140, 80])).to.be(true); + expect(touches(extent, [100, 20, 140, 40])).to.be(false); + expect(touches(extent, [20, 20, 80, 50])).to.be(true); + expect(touches(extent, [20, 20, 40, 50])).to.be(false); + expect(touches(extent, [20, 100, 80, 140])).to.be(true); + expect(touches(extent, [20, 100, 40, 140])).to.be(false); + }); + }); + describe('normalize', function() { it('returns the expected coordinate', function() { var extent = [0, 1, 2, 3];