Skip to content

Commit

Permalink
Add a util helper function to construct evaluation feature used for e…
Browse files Browse the repository at this point in the history
…xpression
  • Loading branch information
zmiao committed Sep 7, 2020
1 parent 05819c8 commit 4c3fb90
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 30 deletions.
6 changes: 2 additions & 4 deletions src/data/bucket/circle_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -88,10 +89,7 @@ class CircleBucket<Layer: CircleStyleLayer | HeatmapStyleLayer> 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;

Expand Down
6 changes: 2 additions & 4 deletions src/data/bucket/fill_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;

Expand Down
6 changes: 2 additions & 4 deletions src/data/bucket/fill_extrusion_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;

Expand Down
6 changes: 2 additions & 4 deletions src/data/bucket/line_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;

Expand Down
7 changes: 2 additions & 5 deletions src/data/bucket/symbol_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
}
Expand Down
24 changes: 24 additions & 0 deletions src/data/evaluation_feature.js
Original file line number Diff line number Diff line change
@@ -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<Array<Point>>
};

/**
* 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) : []};
}
6 changes: 2 additions & 4 deletions src/data/feature_index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
}
Expand Down
7 changes: 2 additions & 5 deletions src/source/tile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 4c3fb90

Please sign in to comment.