From b3ef3c4d41704f155db6fa19cad3fc86c8285d49 Mon Sep 17 00:00:00 2001 From: hu de yi Date: Tue, 4 Nov 2025 14:37:52 +0800 Subject: [PATCH 1/3] fix: fix drawtool when drawtoollayer is webgl layer --- packages/maptalks/src/geometry/Geometry.ts | 2 ++ packages/maptalks/src/layer/DrawToolLayer.ts | 19 +++++++++++++++---- packages/maptalks/src/layer/OverlayLayer.ts | 16 +++++++++++++--- .../maptalks/src/map/tool/DrawToolRegister.ts | 2 +- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/maptalks/src/geometry/Geometry.ts b/packages/maptalks/src/geometry/Geometry.ts index 1e11b3f7cc..7a09e74e73 100644 --- a/packages/maptalks/src/geometry/Geometry.ts +++ b/packages/maptalks/src/geometry/Geometry.ts @@ -96,6 +96,8 @@ export class Geometry extends JSONAble(Eventable(Handlerable(Class))) { //@internal _layer: OverlayLayer; //@internal + _drawToolLayer: OverlayLayer; + //@internal _angle: number //@internal _pivot: Coordinate diff --git a/packages/maptalks/src/layer/DrawToolLayer.ts b/packages/maptalks/src/layer/DrawToolLayer.ts index 66fe21767f..e407f254c0 100644 --- a/packages/maptalks/src/layer/DrawToolLayer.ts +++ b/packages/maptalks/src/layer/DrawToolLayer.ts @@ -14,11 +14,11 @@ export default class DrawToolLayer extends OverlayLayer { static lineLayerClazz: any; static polygonLayerClazz: any; //@internal - _markerLayer: any; + _markerLayer: OverlayLayer; //@internal - _lineLayer: any; + _lineLayer: OverlayLayer; //@internal - _polygonLayer: any; + _polygonLayer: OverlayLayer; static setLayerClass(markerLayerClass, lineLayerClass, polygonLayerClass) { DrawToolLayer.markerLayerClazz = markerLayerClass; @@ -31,7 +31,7 @@ export default class DrawToolLayer extends OverlayLayer { * @param options=null - construct options * @param options.style=null - drawToolLayer's style */ - constructor(id: string, geometries?: DrawToolLayerOptionsType | Array, options: DrawToolLayerOptionsType = {}) { + constructor(id: string, geometries?: DrawToolLayerOptionsType | Array, options: DrawToolLayerOptionsType = {}) { if (geometries && (!isGeometry(geometries) && !Array.isArray(geometries) && GEOJSON_TYPES.indexOf((geometries as any).type) < 0)) { options = geometries; geometries = null; @@ -47,6 +47,14 @@ export default class DrawToolLayer extends OverlayLayer { } } + _bindDrawToolLayer() { + const geoList = this._geoList || []; + geoList.forEach(geo => { + geo._drawToolLayer = this; + }); + return this; + } + bringToFront() { this._polygonLayer.bringToFront(); this._lineLayer.bringToFront(); @@ -59,6 +67,7 @@ export default class DrawToolLayer extends OverlayLayer { geometries = [geometries]; } pushIn(this._geoList, geometries); + this._bindDrawToolLayer(); for (let i = 0; i < geometries.length; i++) { if (this._markerLayer.isVectorLayer) { this._markerLayer.addGeometry(geometries[i]); @@ -80,6 +89,7 @@ export default class DrawToolLayer extends OverlayLayer { } for (let i = 0; i < geometries.length; i++) { this._geoList.splice(geometries[i] as any, 1); + delete geometries[i]._drawToolLayer; if (this._markerLayer.isVectorLayer) { this._markerLayer.removeGeometry(geometries[i]); continue; @@ -99,6 +109,7 @@ export default class DrawToolLayer extends OverlayLayer { for (let i = 0; i < geometries.length; i++) { if (geometries[i]) { this._geoList.splice(geometries[i] as any, 1); + delete geometries[i]._drawToolLayer; } } } diff --git a/packages/maptalks/src/layer/OverlayLayer.ts b/packages/maptalks/src/layer/OverlayLayer.ts index 2072bff8a0..4e5176b585 100644 --- a/packages/maptalks/src/layer/OverlayLayer.ts +++ b/packages/maptalks/src/layer/OverlayLayer.ts @@ -61,6 +61,8 @@ class OverlayLayer extends Layer { //@internal _renderer: OverlayLayerCanvasRenderer; + isVectorLayer?: boolean; + constructor(id: string, geometries?: OverlayLayerOptionsType | Array, options?: OverlayLayerOptionsType) { if (geometries && (!isGeometry(geometries) && !Array.isArray(geometries) && GEOJSON_TYPES.indexOf((geometries as any).type) < 0)) { options = geometries; @@ -119,12 +121,20 @@ class OverlayLayer extends Layer { if (isNil(id) || id === '') { return null; } - if (!this._geoMap[id]) { - return null; + if (this._geoMap[id]) { + return this._geoMap[id]; } - return this._geoMap[id]; + const geoList = this._geoList || []; + for (let i = 0, len = geoList.length; i < len; i++) { + const geo = geoList[i]; + if (geo && geo.getId() === id) { + return geo; + } + } + return null; } + /** * 获取所有geometries,如果提供 filter() 方法,则根据方法返回 * diff --git a/packages/maptalks/src/map/tool/DrawToolRegister.ts b/packages/maptalks/src/map/tool/DrawToolRegister.ts index 5a463f91b3..a49e4b28c0 100644 --- a/packages/maptalks/src/map/tool/DrawToolRegister.ts +++ b/packages/maptalks/src/map/tool/DrawToolRegister.ts @@ -227,7 +227,7 @@ const polygonHooks: modeActionType = { // geometry._setPrjCoordinates(prjCoords); geometry.setCoordinates(coordinates); - const layer = geometry.getLayer(); + const layer = geometry._drawToolLayer || geometry.getLayer(); if (layer) { let polygon = layer.getGeometryById('polygon'); if (!polygon && prjCoords.length >= 3) { From 71ea97b0ab9f24b6746046e2cfc757116ffabc0a Mon Sep 17 00:00:00 2001 From: hu de yi Date: Mon, 10 Nov 2025 15:13:10 +0800 Subject: [PATCH 2/3] update --- packages/maptalks/src/layer/DrawToolLayer.ts | 9 ++++++ packages/maptalks/src/layer/OverlayLayer.ts | 31 +++++++++----------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/maptalks/src/layer/DrawToolLayer.ts b/packages/maptalks/src/layer/DrawToolLayer.ts index e407f254c0..bbcaefc8f4 100644 --- a/packages/maptalks/src/layer/DrawToolLayer.ts +++ b/packages/maptalks/src/layer/DrawToolLayer.ts @@ -1,4 +1,5 @@ import { GEOJSON_TYPES } from "../core/Constants"; +import { isNil } from "../core/util"; import { pushIn } from "../core/util/util"; import { Geometry, LineString, Marker, MultiLineString, MultiPoint, MultiPolygon, Polygon } from "../geometry/index"; import OverlayLayer, { isGeometry, OverlayLayerOptionsType } from "./OverlayLayer"; @@ -69,6 +70,9 @@ export default class DrawToolLayer extends OverlayLayer { pushIn(this._geoList, geometries); this._bindDrawToolLayer(); for (let i = 0; i < geometries.length; i++) { + const geo = geometries[i]; + //cache to _geoMap + this._cacheToGeoMap(geo, i); if (this._markerLayer.isVectorLayer) { this._markerLayer.addGeometry(geometries[i]); continue; @@ -110,6 +114,11 @@ export default class DrawToolLayer extends OverlayLayer { if (geometries[i]) { this._geoList.splice(geometries[i] as any, 1); delete geometries[i]._drawToolLayer; + const geo = geometries[i]; + const geoId = geo.getId(); + if (!isNil(geoId)) { + delete this._geoMap[geoId]; + } } } } diff --git a/packages/maptalks/src/layer/OverlayLayer.ts b/packages/maptalks/src/layer/OverlayLayer.ts index 4e5176b585..1ba4871d5b 100644 --- a/packages/maptalks/src/layer/OverlayLayer.ts +++ b/packages/maptalks/src/layer/OverlayLayer.ts @@ -121,17 +121,10 @@ class OverlayLayer extends Layer { if (isNil(id) || id === '') { return null; } - if (this._geoMap[id]) { - return this._geoMap[id]; - } - const geoList = this._geoList || []; - for (let i = 0, len = geoList.length; i < len; i++) { - const geo = geoList[i]; - if (geo && geo.getId() === id) { - return geo; - } + if (!this._geoMap[id]) { + return null; } - return null; + return this._geoMap[id]; } @@ -421,13 +414,7 @@ class OverlayLayer extends Layer { this._toSort = geo.getZIndex() !== 0; } this._updateZIndex(geo.getZIndex()); - const geoId = geo.getId(); - if (!isNil(geoId)) { - if (!isNil(this._geoMap[geoId])) { - throw new Error('Duplicate geometry id in layer(' + this.getId() + '):' + geoId + ', at index:' + i); - } - this._geoMap[geoId] = geo; - } + this._cacheToGeoMap(geo, i); const internalId = UID(); geo._setInternalId(internalId); this._geoList.push(geo); @@ -459,6 +446,16 @@ class OverlayLayer extends Layer { } } + _cacheToGeoMap(geo: Geometry, i?: number) { + const geoId = geo.getId(); + if (!isNil(geoId)) { + if (!isNil(this._geoMap[geoId])) { + throw new Error('Duplicate geometry id in layer(' + this.getId() + '):' + geoId + ', at index:' + i); + } + this._geoMap[geoId] = geo; + } + } + /** * 移除一个或多个geometries * From c57e28947cc2b5a2d1bd7afd064c00f649d4fa34 Mon Sep 17 00:00:00 2001 From: hu de yi Date: Mon, 10 Nov 2025 15:27:30 +0800 Subject: [PATCH 3/3] updates --- packages/maptalks/src/layer/DrawToolLayer.ts | 25 +++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/maptalks/src/layer/DrawToolLayer.ts b/packages/maptalks/src/layer/DrawToolLayer.ts index bbcaefc8f4..97d1a2a133 100644 --- a/packages/maptalks/src/layer/DrawToolLayer.ts +++ b/packages/maptalks/src/layer/DrawToolLayer.ts @@ -63,6 +63,21 @@ export default class DrawToolLayer extends OverlayLayer { return this; } + _deleteGeo(geo: Geometry) { + if (!geo) { + return this; + } + const index = this._geoList.indexOf(geo); + if (index > -1) { + this._geoList.splice(index, 1); + } + delete geo._drawToolLayer; + const geoId = geo.getId(); + if (!isNil(geoId)) { + delete this._geoMap[geoId]; + } + } + addGeometry(geometries: Geometry | Array) { if (!Array.isArray(geometries)) { geometries = [geometries]; @@ -92,8 +107,7 @@ export default class DrawToolLayer extends OverlayLayer { geometries = [geometries]; } for (let i = 0; i < geometries.length; i++) { - this._geoList.splice(geometries[i] as any, 1); - delete geometries[i]._drawToolLayer; + this._deleteGeo(geometries[i]); if (this._markerLayer.isVectorLayer) { this._markerLayer.removeGeometry(geometries[i]); continue; @@ -112,13 +126,8 @@ export default class DrawToolLayer extends OverlayLayer { const geometries = params.geometries; for (let i = 0; i < geometries.length; i++) { if (geometries[i]) { - this._geoList.splice(geometries[i] as any, 1); - delete geometries[i]._drawToolLayer; const geo = geometries[i]; - const geoId = geo.getId(); - if (!isNil(geoId)) { - delete this._geoMap[geoId]; - } + this._deleteGeo(geo); } } }