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..97d1a2a133 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"; @@ -14,11 +15,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 +32,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 +48,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(); @@ -54,12 +63,31 @@ 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]; } 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; @@ -79,7 +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); + this._deleteGeo(geometries[i]); if (this._markerLayer.isVectorLayer) { this._markerLayer.removeGeometry(geometries[i]); continue; @@ -98,7 +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); + const geo = geometries[i]; + this._deleteGeo(geo); } } } diff --git a/packages/maptalks/src/layer/OverlayLayer.ts b/packages/maptalks/src/layer/OverlayLayer.ts index 2072bff8a0..1ba4871d5b 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; @@ -125,6 +127,7 @@ class OverlayLayer extends Layer { return this._geoMap[id]; } + /** * 获取所有geometries,如果提供 filter() 方法,则根据方法返回 * @@ -411,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); @@ -449,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 * 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) {