diff --git a/src/ol/extent.js b/src/ol/extent.js index f6fbdfb21c..1f7d84bfdb 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -418,7 +418,11 @@ ol.extent.extendXY = function(extent, x, y) { * @return {number} Area. */ ol.extent.getArea = function(extent) { - return ol.extent.getWidth(extent) * ol.extent.getHeight(extent); + var area = 0; + if (!ol.extent.isEmpty(extent)) { + area = ol.extent.getWidth(extent) * ol.extent.getHeight(extent); + } + return area; }; @@ -511,11 +515,44 @@ ol.extent.getHeight = function(extent) { * @return {number} Intersection area. */ ol.extent.getIntersectionArea = function(extent1, extent2) { - var minX = Math.max(extent1[0], extent2[0]); - var minY = Math.max(extent1[1], extent2[1]); - var maxX = Math.min(extent1[2], extent2[2]); - var maxY = Math.min(extent1[3], extent2[3]); - return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); + var intersection = ol.extent.getIntersection(extent1, extent2); + return ol.extent.getArea(intersection); +}; + + +/** + * Get the intersection of two extents. + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @param {ol.Extent=} opt_extent Optional extent to populate with intersection. + * @return {ol.Extent} Intersecting extent. + */ +ol.extent.getIntersection = function(extent1, extent2, opt_extent) { + var intersection = goog.isDef(opt_extent) ? + opt_extent : ol.extent.createEmpty(); + if (ol.extent.intersects(extent1, extent2)) { + if (extent1[0] > extent2[0]) { + intersection[0] = extent1[0]; + } else { + intersection[0] = extent2[0]; + } + if (extent1[1] > extent2[1]) { + intersection[1] = extent1[1]; + } else { + intersection[1] = extent2[1]; + } + if (extent1[2] < extent2[2]) { + intersection[2] = extent1[2]; + } else { + intersection[2] = extent2[2]; + } + if (extent1[3] < extent2[3]) { + intersection[3] = extent1[3]; + } else { + intersection[3] = extent2[3]; + } + } + return intersection; }; diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index a8dfcc5e37..4a884b64ab 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -24,6 +24,30 @@ describe('ol.extent', function() { }); + describe('getIntersection()', function() { + it('returns the intersection of two extents', function() { + var world = [-180, -90, 180, 90]; + var north = [-180, 0, 180, 90]; + var farNorth = [-180, 45, 180, 90]; + var east = [0, -90, 180, 90]; + var farEast = [90, -90, 180, 90]; + var south = [-180, -90, 180, 0]; + var farSouth = [-180, -90, 180, -45]; + var west = [-180, -90, 0, 90]; + var farWest = [-180, -90, -90, 90]; + var none = ol.extent.createEmpty(); + expect(ol.extent.getIntersection(world, none)).to.eql(none); + expect(ol.extent.getIntersection(world, north)).to.eql(north); + expect(ol.extent.getIntersection(world, east)).to.eql(east); + expect(ol.extent.getIntersection(world, south)).to.eql(south); + expect(ol.extent.getIntersection(world, west)).to.eql(west); + expect(ol.extent.getIntersection(farEast, farWest)).to.eql(none); + expect(ol.extent.getIntersection(farNorth, farSouth)).to.eql(none); + expect(ol.extent.getIntersection(north, west)).to.eql([-180, 0, 0, 90]); + expect(ol.extent.getIntersection(east, south)).to.eql([0, -90, 180, 0]); + }); + }); + describe('containsCoordinate', function() { describe('positive', function() {