From 8e0a61ac5f990032549a4559bef769ca13ce0a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ziela=C5=84ski?= Date: Wed, 26 Aug 2020 15:11:11 +0200 Subject: [PATCH] Adding original properties to cloned geometry --- src/ol/geom/Circle.js | 8 +++++++- src/ol/geom/Geometry.js | 11 +++++++++++ src/ol/geom/GeometryCollection.js | 1 + src/ol/geom/LineString.js | 7 ++++++- src/ol/geom/MultiLineString.js | 4 +++- src/ol/geom/MultiPoint.js | 1 + src/ol/geom/MultiPolygon.js | 5 ++++- src/ol/geom/Point.js | 1 + src/ol/geom/Polygon.js | 4 +++- test/spec/ol/geom/circle.test.js | 3 +++ test/spec/ol/geom/geometrycollection.test.js | 2 ++ test/spec/ol/geom/multipolygon.test.js | 3 +++ 12 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/ol/geom/Circle.js b/src/ol/geom/Circle.js index 6e4a669976..644a89cf1e 100644 --- a/src/ol/geom/Circle.js +++ b/src/ol/geom/Circle.js @@ -37,7 +37,13 @@ class Circle extends SimpleGeometry { * @api */ clone() { - return new Circle(this.flatCoordinates.slice(), undefined, this.layout); + const circle = new Circle( + this.flatCoordinates.slice(), + undefined, + this.layout + ); + circle.importPropertiesFrom(this); + return circle; } /** diff --git a/src/ol/geom/Geometry.js b/src/ol/geom/Geometry.js index e7d7cd26f0..be648f7a11 100644 --- a/src/ol/geom/Geometry.js +++ b/src/ol/geom/Geometry.js @@ -109,6 +109,17 @@ class Geometry extends BaseObject { return abstract(); } + /** + * Import properties from another geometry. + * @param {Geometry} geometry Source geometry. + * @protected + */ + importPropertiesFrom(geometry) { + if (geometry.hasProperties()) { + this.setProperties(geometry.getProperties(), true); + } + } + /** * @abstract * @param {number} x X. diff --git a/src/ol/geom/GeometryCollection.js b/src/ol/geom/GeometryCollection.js index 2f08c25cea..f4b17ac001 100644 --- a/src/ol/geom/GeometryCollection.js +++ b/src/ol/geom/GeometryCollection.js @@ -69,6 +69,7 @@ class GeometryCollection extends Geometry { clone() { const geometryCollection = new GeometryCollection(null); geometryCollection.setGeometries(this.geometries_); + geometryCollection.importPropertiesFrom(this); return geometryCollection; } diff --git a/src/ol/geom/LineString.js b/src/ol/geom/LineString.js index c791e0ebdd..1bb5a75c1f 100644 --- a/src/ol/geom/LineString.js +++ b/src/ol/geom/LineString.js @@ -87,7 +87,12 @@ class LineString extends SimpleGeometry { * @api */ clone() { - return new LineString(this.flatCoordinates.slice(), this.layout); + const lineString = new LineString( + this.flatCoordinates.slice(), + this.layout + ); + lineString.importPropertiesFrom(this); + return lineString; } /** diff --git a/src/ol/geom/MultiLineString.js b/src/ol/geom/MultiLineString.js index d604195899..8ab28379ef 100644 --- a/src/ol/geom/MultiLineString.js +++ b/src/ol/geom/MultiLineString.js @@ -102,11 +102,13 @@ class MultiLineString extends SimpleGeometry { * @api */ clone() { - return new MultiLineString( + const multiLineString = new MultiLineString( this.flatCoordinates.slice(), this.layout, this.ends_.slice() ); + multiLineString.importPropertiesFrom(this); + return multiLineString; } /** diff --git a/src/ol/geom/MultiPoint.js b/src/ol/geom/MultiPoint.js index 92033cff8b..0829353739 100644 --- a/src/ol/geom/MultiPoint.js +++ b/src/ol/geom/MultiPoint.js @@ -61,6 +61,7 @@ class MultiPoint extends SimpleGeometry { this.flatCoordinates.slice(), this.layout ); + multiPoint.importPropertiesFrom(this); return multiPoint; } diff --git a/src/ol/geom/MultiPolygon.js b/src/ol/geom/MultiPolygon.js index 3925cd69b5..1a3084b2c0 100644 --- a/src/ol/geom/MultiPolygon.js +++ b/src/ol/geom/MultiPolygon.js @@ -155,11 +155,14 @@ class MultiPolygon extends SimpleGeometry { newEndss[i] = this.endss_[i].slice(); } - return new MultiPolygon( + const multiPolygon = new MultiPolygon( this.flatCoordinates.slice(), this.layout, newEndss ); + multiPolygon.importPropertiesFrom(this); + + return multiPolygon; } /** diff --git a/src/ol/geom/Point.js b/src/ol/geom/Point.js index 08cae660e9..a9ef7e641b 100644 --- a/src/ol/geom/Point.js +++ b/src/ol/geom/Point.js @@ -30,6 +30,7 @@ class Point extends SimpleGeometry { */ clone() { const point = new Point(this.flatCoordinates.slice(), this.layout); + point.importPropertiesFrom(this); return point; } diff --git a/src/ol/geom/Polygon.js b/src/ol/geom/Polygon.js index 974340a6e0..009337d253 100644 --- a/src/ol/geom/Polygon.js +++ b/src/ol/geom/Polygon.js @@ -118,11 +118,13 @@ class Polygon extends SimpleGeometry { * @api */ clone() { - return new Polygon( + const polygon = new Polygon( this.flatCoordinates.slice(), this.layout, this.ends_.slice() ); + polygon.importPropertiesFrom(this); + return polygon; } /** diff --git a/test/spec/ol/geom/circle.test.js b/test/spec/ol/geom/circle.test.js index 6459cb1f90..f4bfc62212 100644 --- a/test/spec/ol/geom/circle.test.js +++ b/test/spec/ol/geom/circle.test.js @@ -9,11 +9,14 @@ describe('ol.geom.Circle', function () { describe('#clone', function () { it('returns a clone', function () { + circle.setProperties({foo: 'bar', baz: null}); + const clone = circle.clone(); expect(clone).to.be.an(Circle); expect(clone.getCenter()).to.eql(circle.getCenter()); expect(clone.getCenter()).not.to.be(circle.getCenter()); expect(clone.getRadius()).to.be(circle.getRadius()); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); }); diff --git a/test/spec/ol/geom/geometrycollection.test.js b/test/spec/ol/geom/geometrycollection.test.js index 5585f0fb33..f66cf9e25a 100644 --- a/test/spec/ol/geom/geometrycollection.test.js +++ b/test/spec/ol/geom/geometrycollection.test.js @@ -97,6 +97,7 @@ describe('ol.geom.GeometryCollection', function () { ]); const poly = new Polygon([outer, inner1, inner2]); const multi = new GeometryCollection([point, line, poly]); + multi.setProperties({foo: 'bar', baz: null}); const clone = multi.clone(); expect(clone).to.not.be(multi); const geometries = clone.getGeometries(); @@ -106,6 +107,7 @@ describe('ol.geom.GeometryCollection', function () { [30, 40], ]); expect(geometries[2].getCoordinates()).to.eql([outer, inner1, inner2]); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); it('does a deep clone', function () { diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js index 32895cccb6..bb97567dee 100644 --- a/test/spec/ol/geom/multipolygon.test.js +++ b/test/spec/ol/geom/multipolygon.test.js @@ -276,8 +276,11 @@ describe('ol.geom.MultiPolygon', function () { describe('#clone()', function () { it('has the expected endss_', function () { + multiPolygon.setProperties({foo: 'bar', baz: null}); + const clone = multiPolygon.clone(); expect(multiPolygon.endss_).to.eql(clone.endss_); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); });