diff --git a/packages/vt/src/layer/vector/Vector3DLayerRenderer.js b/packages/vt/src/layer/vector/Vector3DLayerRenderer.js index c9bd5381a2..db57d45b8d 100644 --- a/packages/vt/src/layer/vector/Vector3DLayerRenderer.js +++ b/packages/vt/src/layer/vector/Vector3DLayerRenderer.js @@ -54,11 +54,14 @@ const prefix = (SYMBOL_PREFIX + '').trim(); const KEY_IDX_NAME = (KEY_IDX + '').trim(); let EMPTY_POSITION = new Float32Array(1); const EMPTY_ARRAY = []; +const TEMP_ARRAY = []; class Vector3DLayerRenderer extends CanvasCompatible(LayerAbstractRenderer) { constructor(...args) { super(...args); this.features = {}; + this.featuresArray = []; + this.featuresChanged = false; this._geometries = {}; this._counter = 0; this._allFeatures = {}; @@ -100,15 +103,23 @@ class Vector3DLayerRenderer extends CanvasCompatible(LayerAbstractRenderer) { } _checkFeaturesVisibleChange() { - const features = this.features; - if (!features) { + if (this.featuresChanged) { + this.featuresArray = Object.values(this.features); + this.featuresChanged = false; + } + const featuresArray = this.featuresArray; + if (!featuresArray) { return this; } //实时检测feature的visible变化 - for (const id in features) { - let feats = features[id] || []; + for (let m = 0, len = featuresArray.length; m < len; m++) { + let feats = featuresArray[m]; + if (!feats) { + continue; + } if (!Array.isArray(feats)) { - feats = [feats]; + TEMP_ARRAY[0] = feats; + feats = TEMP_ARRAY; } if (!feats.length) { continue; @@ -1082,6 +1093,7 @@ class Vector3DLayerRenderer extends CanvasCompatible(LayerAbstractRenderer) { this._removeFeatures(uid); } this.features[uid] = convertToFeature(geo, this._kidGen, this.features[uid]); + this.featuresChanged = true; const feas = this.features[uid]; this._refreshFeatures(feas, uid); this._geometries[uid] = geo; @@ -1271,6 +1283,7 @@ class Vector3DLayerRenderer extends CanvasCompatible(LayerAbstractRenderer) { delete this._geometries[uid]; this._removeFeatures(uid); delete this.features[uid]; + this.featuresChanged = true; } } this.markRebuild(); diff --git a/packages/vt/src/layer/vector/util/convert_to_feature.js b/packages/vt/src/layer/vector/util/convert_to_feature.js index 2419ec042f..0b90d08684 100644 --- a/packages/vt/src/layer/vector/util/convert_to_feature.js +++ b/packages/vt/src/layer/vector/util/convert_to_feature.js @@ -1,4 +1,4 @@ -import { extend, hasOwn } from '../../../common/Util'; +import { extend, hasOwn, isNil } from '../../../common/Util'; import * as maptalks from 'maptalks'; import { KEY_IDX } from '../../../common/Constant'; import { LINE_GRADIENT_PROP_KEY } from './symbols'; @@ -12,9 +12,19 @@ const GRADIENT_PROP_KEY = (LINE_GRADIENT_PROP_KEY + '').trim(); function watchGeoVisible(featue, symbol, geo) { //geo 的visible受options.visible 和style控制 - const styleFn = maptalks.MapboxUtil.loadGeoSymbol(symbol, geo); + //symbol里是否有visible和opacity + let hasVisibleProp = !isNil(symbol.visible), hasOpacityProp = !isNil(symbol.opacity); + let styleFn = symbol; + if (hasVisibleProp || hasOpacityProp) { + styleFn = maptalks.MapboxUtil.loadGeoSymbol(symbol, geo); + } Object.defineProperty(featue, 'getVisible', { get: function () { + //样式里没有visible和opacity + if (!hasVisibleProp && (!hasOpacityProp)) { + const visible = geo.options.visible; + return visible; + } //实时检测geo的可见性,feature上的值是静态值,不应该检测其值 const isVisible = geo.isVisible(); if (!isVisible) {