UNPKG

maplibre-gl

Version:

BSD licensed community fork of mapbox-gl, a WebGL interactive maps library

82 lines (64 loc) 2.69 kB
import StyleLayer from './style_layer'; import createStyleLayer from './create_style_layer'; import featureFilter from '../style-spec/feature_filter'; import groupByLayout from '../style-spec/group_by_layout'; import type {TypedStyleLayer} from './style_layer/typed_style_layer'; import type {LayerSpecification} from '../style-spec/types.g'; export type LayerConfigs = {[_: string]: LayerSpecification}; export type Family<Layer extends TypedStyleLayer> = Array<Layer>; class StyleLayerIndex { familiesBySource: { [source: string]: { [sourceLayer: string]: Array<Family<any>>; }; }; keyCache: {[source: string]: string}; _layerConfigs: LayerConfigs; _layers: {[_: string]: StyleLayer}; constructor(layerConfigs?: Array<LayerSpecification> | null) { this.keyCache = {}; if (layerConfigs) { this.replace(layerConfigs); } } replace(layerConfigs: Array<LayerSpecification>) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, []); } update(layerConfigs: Array<LayerSpecification>, removedIds: Array<string>) { for (const layerConfig of layerConfigs) { this._layerConfigs[layerConfig.id] = layerConfig; const layer = this._layers[layerConfig.id] = createStyleLayer(layerConfig); layer._featureFilter = featureFilter(layer.filter); if (this.keyCache[layerConfig.id]) delete this.keyCache[layerConfig.id]; } for (const id of removedIds) { delete this.keyCache[id]; delete this._layerConfigs[id]; delete this._layers[id]; } this.familiesBySource = {}; const groups = groupByLayout(Object.values(this._layerConfigs), this.keyCache); for (const layerConfigs of groups) { const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]); const layer = layers[0]; if (layer.visibility === 'none') { continue; } const sourceId = layer.source || ''; let sourceGroup = this.familiesBySource[sourceId]; if (!sourceGroup) { sourceGroup = this.familiesBySource[sourceId] = {}; } const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer'; let sourceLayerFamilies = sourceGroup[sourceLayerId]; if (!sourceLayerFamilies) { sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } sourceLayerFamilies.push(layers); } } } export default StyleLayerIndex;