From b77f0e7d3aee8cdfb50f4febb78b4a7748336a21 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 10 Mar 2014 16:53:12 +0100 Subject: [PATCH] Add ol.geom.MultiPolygon#appendPolygon --- src/ol/geom/multipolygon.exports | 1 + src/ol/geom/multipolygon.js | 25 +++++++++++++++++++++++++ test/spec/ol/geom/multipolygon.test.js | 22 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/ol/geom/multipolygon.exports b/src/ol/geom/multipolygon.exports index 13168e0436..6f67842bc3 100644 --- a/src/ol/geom/multipolygon.exports +++ b/src/ol/geom/multipolygon.exports @@ -1,4 +1,5 @@ @exportSymbol ol.geom.MultiPolygon +@exportProperty ol.geom.MultiPolygon.prototype.appendPolygon @exportProperty ol.geom.MultiPolygon.prototype.clone @exportProperty ol.geom.MultiPolygon.prototype.getArea @exportProperty ol.geom.MultiPolygon.prototype.getCoordinates diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index f70cf78d6c..acd04669da 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -72,6 +72,31 @@ ol.geom.MultiPolygon = function(coordinates, opt_layout) { goog.inherits(ol.geom.MultiPolygon, ol.geom.SimpleGeometry); +/** + * @param {ol.geom.Polygon} polygon Polygon. + */ +ol.geom.MultiPolygon.prototype.appendPolygon = function(polygon) { + goog.asserts.assert(polygon.getLayout() == this.layout); + /** @type {Array.} */ + var ends; + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = polygon.getFlatCoordinates().slice(); + ends = polygon.getEnds().slice(); + this.endss_.push(); + } else { + var offset = this.flatCoordinates.length; + goog.array.extend(this.flatCoordinates, polygon.getFlatCoordinates()); + ends = polygon.getEnds().slice(); + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + ends[i] += offset; + } + } + this.endss_.push(ends); + this.dispatchChangeEvent(); +}; + + /** * @inheritDoc */ diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js index 0c21f9fb00..03dad6ab5b 100644 --- a/test/spec/ol/geom/multipolygon.test.js +++ b/test/spec/ol/geom/multipolygon.test.js @@ -10,6 +10,28 @@ describe('ol.geom.MultiPolygon', function() { }).not.to.throwException(); }); + describe('with an empty MultiPolygon', function() { + + var multiPolygon; + beforeEach(function() { + multiPolygon = new ol.geom.MultiPolygon(null); + }); + + it('can append polygons', function() { + multiPolygon.appendPolygon( + new ol.geom.Polygon([[[0, 0], [0, 2], [1, 1], [2, 0]]])); + expect(multiPolygon.getCoordinates()).to.eql( + [[[[0, 0], [0, 2], [1, 1], [2, 0]]]]); + multiPolygon.appendPolygon( + new ol.geom.Polygon([[[3, 0], [4, 1], [5, 2], [5, 0]]])); + expect(multiPolygon.getCoordinates()).to.eql([ + [[[0, 0], [0, 2], [1, 1], [2, 0]]], + [[[3, 0], [4, 1], [5, 2], [5, 0]]] + ]); + }); + + }); + describe('with a simple MultiPolygon', function() { var multiPolygon;