From 4c3fb90c0a31dfdae87b4055790141732cf974e4 Mon Sep 17 00:00:00 2001 From: zmiao Date: Mon, 7 Sep 2020 22:31:10 +0300 Subject: [PATCH] Add a util helper function to construct evaluation feature used for expression --- src/data/bucket/circle_bucket.js | 6 ++---- src/data/bucket/fill_bucket.js | 6 ++---- src/data/bucket/fill_extrusion_bucket.js | 6 ++---- src/data/bucket/line_bucket.js | 6 ++---- src/data/bucket/symbol_bucket.js | 7 ++----- src/data/evaluation_feature.js | 24 ++++++++++++++++++++++++ src/data/feature_index.js | 6 ++---- src/source/tile.js | 7 ++----- 8 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 src/data/evaluation_feature.js diff --git a/src/data/bucket/circle_bucket.js b/src/data/bucket/circle_bucket.js index f86e63f53de..d39a6dac7f9 100644 --- a/src/data/bucket/circle_bucket.js +++ b/src/data/bucket/circle_bucket.js @@ -7,6 +7,7 @@ import SegmentVector from '../segment'; import {ProgramConfigurationSet} from '../program_configuration'; import {TriangleIndexArray} from '../index_array_type'; import loadGeometry from '../load_geometry'; +import toEvaluationFeature from '../evaluation_feature'; import EXTENT from '../extent'; import {register} from '../../util/web_worker_transfer'; import EvaluationParameters from '../../style/evaluation_parameters'; @@ -88,10 +89,7 @@ class CircleBucket implements Bucke for (const {feature, id, index, sourceLayerIndex} of features) { const needGeometry = this.layers[0]._featureFilter.needGeometry; - const evaluationFeature = {type: feature.type, - id, - properties: feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; diff --git a/src/data/bucket/fill_bucket.js b/src/data/bucket/fill_bucket.js index d46c7e0af09..c2a90482196 100644 --- a/src/data/bucket/fill_bucket.js +++ b/src/data/bucket/fill_bucket.js @@ -13,6 +13,7 @@ const EARCUT_MAX_RINGS = 500; import {register} from '../../util/web_worker_transfer'; import {hasPattern, addPatternDependencies} from './pattern_bucket_features'; import loadGeometry from '../load_geometry'; +import toEvaluationFeature from '../evaluation_feature'; import EvaluationParameters from '../../style/evaluation_parameters'; import type {CanonicalTileID} from '../../source/tile_id'; @@ -81,10 +82,7 @@ class FillBucket implements Bucket { for (const {feature, id, index, sourceLayerIndex} of features) { const needGeometry = this.layers[0]._featureFilter.needGeometry; - const evaluationFeature = {type: feature.type, - id, - properties: feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; diff --git a/src/data/bucket/fill_extrusion_bucket.js b/src/data/bucket/fill_extrusion_bucket.js index 0ec7c6483b3..b45ba4b2ce9 100644 --- a/src/data/bucket/fill_extrusion_bucket.js +++ b/src/data/bucket/fill_extrusion_bucket.js @@ -16,6 +16,7 @@ const EARCUT_MAX_RINGS = 500; import {register} from '../../util/web_worker_transfer'; import {hasPattern, addPatternDependencies} from './pattern_bucket_features'; import loadGeometry from '../load_geometry'; +import toEvaluationFeature from '../evaluation_feature'; import EvaluationParameters from '../../style/evaluation_parameters'; import type {CanonicalTileID} from '../../source/tile_id'; @@ -94,10 +95,7 @@ class FillExtrusionBucket implements Bucket { for (const {feature, id, index, sourceLayerIndex} of features) { const needGeometry = this.layers[0]._featureFilter.needGeometry; - const evaluationFeature = {type: feature.type, - id, - properties: feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; diff --git a/src/data/bucket/line_bucket.js b/src/data/bucket/line_bucket.js index ae0b5cdb4be..bd72e52bbeb 100644 --- a/src/data/bucket/line_bucket.js +++ b/src/data/bucket/line_bucket.js @@ -13,6 +13,7 @@ const vectorTileFeatureTypes = mvt.VectorTileFeature.types; import {register} from '../../util/web_worker_transfer'; import {hasPattern, addPatternDependencies} from './pattern_bucket_features'; import loadGeometry from '../load_geometry'; +import toEvaluationFeature from '../evaluation_feature'; import EvaluationParameters from '../../style/evaluation_parameters'; import type {CanonicalTileID} from '../../source/tile_id'; @@ -149,10 +150,7 @@ class LineBucket implements Bucket { for (const {feature, id, index, sourceLayerIndex} of features) { const needGeometry = this.layers[0]._featureFilter.needGeometry; - const evaluationFeature = {type: feature.type, - id, - properties: feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index c534f1888c4..1d00ebd71eb 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -26,6 +26,7 @@ import mergeLines from '../../symbol/mergelines'; import {allowsVerticalWritingMode, stringContainsRTLText} from '../../util/script_detection'; import {WritingMode} from '../../symbol/shaping'; import loadGeometry from '../load_geometry'; +import toEvaluationFeature from '../evaluation_feature'; import mvt from '@mapbox/vector-tile'; const vectorTileFeatureTypes = mvt.VectorTileFeature.types; import {verticalizedCharacterMap} from '../../util/verticalize_punctuation'; @@ -440,11 +441,7 @@ class SymbolBucket implements Bucket { for (const {feature, id, index, sourceLayerIndex} of features) { const needGeometry = layer._featureFilter.needGeometry; - const evaluationFeature = {type: feature.type, - id, - properties: feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; - + const evaluationFeature = toEvaluationFeature(feature, needGeometry); if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) { continue; } diff --git a/src/data/evaluation_feature.js b/src/data/evaluation_feature.js new file mode 100644 index 00000000000..bf8579d7b4a --- /dev/null +++ b/src/data/evaluation_feature.js @@ -0,0 +1,24 @@ +// @flow + +import loadGeometry from './load_geometry'; + +type EvaluationFeature = { + +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'MultiPoint' | 'LineString' | 'MultiLineString' | 'Polygon' | 'MultiPolygon', + +id?: any, + +properties: {[_: string]: any}, + +geometry?: Array> +}; + +/** + * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which + * will be loaded based on necessity. + * @param {VectorTileFeature} feature + * @param {boolean} needGeometry + * @private + */ +export default function toEvaluationFeature(feature: VectorTileFeature, needGeometry: boolean): EvaluationFeature { + return {type: feature.type, + id: feature.id, + properties:feature.properties, + geometry: needGeometry ? loadGeometry(feature) : []}; +} diff --git a/src/data/feature_index.js b/src/data/feature_index.js index dd622f67a87..df030e7e2f1 100644 --- a/src/data/feature_index.js +++ b/src/data/feature_index.js @@ -3,6 +3,7 @@ import Point from '@mapbox/point-geometry'; import loadGeometry from './load_geometry'; +import toEvaluationFeature from './evaluation_feature'; import EXTENT from './extent'; import featureFilter from '../style-spec/feature_filter'; import Grid from 'grid-index'; @@ -186,10 +187,7 @@ class FeatureIndex { const feature = sourceLayer.feature(featureIndex); if (filter.needGeometry) { - const evaluationFeature = {type: feature.type, - id: feature.id, - properties: feature.properties, - geometry: loadGeometry(feature)}; + const evaluationFeature = toEvaluationFeature(feature, true); if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) { return; } diff --git a/src/source/tile.js b/src/source/tile.js index 15699d788ed..419059b7ac2 100644 --- a/src/source/tile.js +++ b/src/source/tile.js @@ -9,7 +9,7 @@ import SymbolBucket from '../data/bucket/symbol_bucket'; import {CollisionBoxArray} from '../data/array_types'; import Texture from '../render/texture'; import browser from '../util/browser'; -import loadGeometry from '../data/load_geometry'; +import toEvaluationFeature from '../data/evaluation_feature'; import EvaluationParameters from '../style/evaluation_parameters'; import SourceFeatureState from '../source/source_state'; import {lazyLoadRTLTextPlugin} from './rtl_text_plugin'; @@ -309,10 +309,7 @@ class Tile { for (let i = 0; i < layer.length; i++) { const feature = layer.feature(i); if (filter.needGeometry) { - const evaluationFeature = {type: feature.type, - id: feature.id, - properties: feature.properties, - geometry: loadGeometry(feature)}; + const evaluationFeature = toEvaluationFeature(feature, true); if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) continue; } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { continue;