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) {