Function for getting extent intersection

This commit is contained in:
Tim Schaub
2014-07-06 17:11:39 -06:00
parent 9de010c791
commit 42f953d08d
2 changed files with 67 additions and 6 deletions

View File

@@ -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;
};

View File

@@ -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() {