From c8bbeca06e23b3f8b567268abcdd2ce5ed1a6bf7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 10 Mar 2014 16:40:19 +0100 Subject: [PATCH] Add ol.geom.MultiPolygon#getPolygon --- src/ol/geom/multipolygon.exports | 1 + src/ol/geom/multipolygon.js | 31 ++++++++++++++++++++++++++ test/spec/ol/geom/multipolygon.test.js | 11 +++++++++ 3 files changed, 43 insertions(+) diff --git a/src/ol/geom/multipolygon.exports b/src/ol/geom/multipolygon.exports index 07d0d094b8..13168e0436 100644 --- a/src/ol/geom/multipolygon.exports +++ b/src/ol/geom/multipolygon.exports @@ -3,6 +3,7 @@ @exportProperty ol.geom.MultiPolygon.prototype.getArea @exportProperty ol.geom.MultiPolygon.prototype.getCoordinates @exportProperty ol.geom.MultiPolygon.prototype.getInteriorPoints +@exportProperty ol.geom.MultiPolygon.prototype.getPolygon @exportProperty ol.geom.MultiPolygon.prototype.getPolygons @exportProperty ol.geom.MultiPolygon.prototype.getType @exportProperty ol.geom.MultiPolygon.prototype.setCoordinates diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index ebab3694e1..f70cf78d6c 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -205,6 +205,37 @@ ol.geom.MultiPolygon.prototype.getSimplifiedGeometryInternal = }; +/** + * @param {number} index Index. + * @return {ol.geom.Polygon} Polygon. + */ +ol.geom.MultiPolygon.prototype.getPolygon = function(index) { + goog.asserts.assert(0 <= index && index < this.endss_.length); + if (index < 0 || this.endss_.length <= index) { + return null; + } + var offset; + if (index === 0) { + offset = 0; + } else { + var prevEnds = this.endss_[index - 1]; + offset = prevEnds[prevEnds.length - 1]; + } + var ends = this.endss_[index].slice(); + var end = ends[ends.length - 1]; + if (offset !== 0) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + ends[i] -= offset; + } + } + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates( + this.layout, this.flatCoordinates.slice(offset, end), ends); + return polygon; +}; + + /** * @return {Array.} Polygons. * @todo stability experimental diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js index b515b1d475..0c21f9fb00 100644 --- a/test/spec/ol/geom/multipolygon.test.js +++ b/test/spec/ol/geom/multipolygon.test.js @@ -20,6 +20,17 @@ describe('ol.geom.MultiPolygon', function() { ]); }); + it('can return individual polygons', function() { + var polygon0 = multiPolygon.getPolygon(0); + expect(polygon0).to.be.an(ol.geom.Polygon); + expect(polygon0.getCoordinates()).to.eql( + [[[0, 0], [0, 2], [1, 1], [2, 0]]]); + var polygon1 = multiPolygon.getPolygon(1); + expect(polygon1).to.be.an(ol.geom.Polygon); + expect(polygon1.getCoordinates()).to.eql( + [[[3, 0], [4, 1], [5, 2], [5, 0]]]); + }); + it('can return all polygons', function() { var polygons = multiPolygon.getPolygons(); expect(polygons).to.be.an(Array);