From 8593d013858b1f46e1845814531a47c9d12bbb36 Mon Sep 17 00:00:00 2001 From: deyihu Date: Sun, 15 Jun 2025 18:39:24 +0800 Subject: [PATCH 1/2] fix MultiGeometry setProperties --- packages/maptalks/src/geometry/Geometry.ts | 10 +++ .../test/geometry/GeometryCollectionSpec.js | 65 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/packages/maptalks/src/geometry/Geometry.ts b/packages/maptalks/src/geometry/Geometry.ts index 33781cbb2b..1d5dc7fd72 100644 --- a/packages/maptalks/src/geometry/Geometry.ts +++ b/packages/maptalks/src/geometry/Geometry.ts @@ -378,9 +378,19 @@ export class Geometry extends JSONAble(Eventable(Handlerable(Class))) { setProperties(properties: { [key: string]: any }): this { const old = this.properties; this.properties = isObject(properties) ? extend({}, properties) : properties; + const children = this.getGeometries ? this.getGeometries() : []; + children.forEach(child => { + const subPro = child.getProperties ? child.getProperties() : {}; + const mergePro = extend(subPro, properties); + if (child.setProperties) { + child.setProperties(mergePro); + } + }); + //such as altitude update this._clearAltitudeCache(); this._repaint(); + /** * propertieschange event, thrown when geometry's properties is changed. * diff --git a/packages/maptalks/test/geometry/GeometryCollectionSpec.js b/packages/maptalks/test/geometry/GeometryCollectionSpec.js index 439e6e02bb..ad4c1bcc11 100644 --- a/packages/maptalks/test/geometry/GeometryCollectionSpec.js +++ b/packages/maptalks/test/geometry/GeometryCollectionSpec.js @@ -483,6 +483,71 @@ describe('#GeometryCollection', function () { }) layer.addGeometry(polygons) }); + + it('#2565 multi geometry setproperties', function () { + let properties = { + name: 1 + } + const geojson = { + type: 'Feature', + properties: properties, + geometry: { + type: 'MultiPoint', + coordinates: [ + [0, 0], + [1, 1] + ] + } + } + const multipoint = maptalks.GeoJSON.toGeometry(geojson); + expect(multipoint).to.be.ok(); + expect(multipoint.getProperties()).to.be.eql(properties); + properties = { + name: 2, + age: 18 + } + multipoint.setProperties(properties); + expect(multipoint.getProperties()).to.be.eql(properties); + multipoint.forEach(point => { + expect(point.getProperties()).to.be.eql(properties); + }); + + const point = new maptalks.Marker([0, 0], { + properties: { + name: 1 + } + }); + const line = new maptalks.LineString([[1, 1], [2, 2]], { + properties: { + name: 2 + } + }); + + const geoCollection = new maptalks.GeometryCollection([point, line]); + expect(geoCollection).to.be.ok(); + geoCollection.forEach((geo, index) => { + if (index === 0) { + expect(geo.getProperties()).to.be.eql({ name: 1 }); + } else { + expect(geo.getProperties()).to.be.eql({ name: 2 }); + } + }); + + properties = { + age: 18 + } + + geoCollection.setProperties(properties); + expect(geoCollection.getProperties()).to.be.eql(properties); + geoCollection.forEach((geo, index) => { + if (index === 0) { + expect(geo.getProperties()).to.be.eql({ name: 1, ...properties }); + } else { + expect(geo.getProperties()).to.be.eql({ name: 2, ...properties }); + } + }); + + }); }); function genPoints() { From 5d71940b0c9a2b1c698adc6aed7c2ce347e921db Mon Sep 17 00:00:00 2001 From: deyihu Date: Sun, 15 Jun 2025 22:03:16 +0800 Subject: [PATCH 2/2] tweaks --- packages/maptalks/src/geometry/Geometry.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/maptalks/src/geometry/Geometry.ts b/packages/maptalks/src/geometry/Geometry.ts index 1d5dc7fd72..bdd0369941 100644 --- a/packages/maptalks/src/geometry/Geometry.ts +++ b/packages/maptalks/src/geometry/Geometry.ts @@ -380,8 +380,8 @@ export class Geometry extends JSONAble(Eventable(Handlerable(Class))) { this.properties = isObject(properties) ? extend({}, properties) : properties; const children = this.getGeometries ? this.getGeometries() : []; children.forEach(child => { - const subPro = child.getProperties ? child.getProperties() : {}; - const mergePro = extend(subPro, properties); + const subPro = child.getProperties ? child.getProperties() || {} : {}; + const mergePro = extend(subPro, properties || {}); if (child.setProperties) { child.setProperties(mergePro); }