import TileHierarchy from "./TileHierarchy" import { UIEventSource } from "../../UIEventSource" import FeatureSource, { FeatureSourceForLayer, IndexedFeatureSource, Tiled } from "../FeatureSource" import FilteredLayer from "../../../Models/FilteredLayer" import FeatureSourceMerger from "../Sources/FeatureSourceMerger" import { Tiles } from "../../../Models/TileRange" import { BBox } from "../../BBox" export class TileHierarchyMerger implements TileHierarchy { public readonly loadedTiles: Map = new Map< number, FeatureSourceForLayer & Tiled >() public readonly layer: FilteredLayer private readonly sources: Map> = new Map< number, UIEventSource >() private _handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource, index: number) => void constructor( layer: FilteredLayer, handleTile: ( src: FeatureSourceForLayer & IndexedFeatureSource & Tiled, index: number ) => void ) { this.layer = layer this._handleTile = handleTile } /** * Add another feature source for the given tile. * Entries for this tile will be merged * @param src */ public registerTile(src: FeatureSource & Tiled) { const index = src.tileIndex if (this.sources.has(index)) { const sources = this.sources.get(index) sources.data.push(src) sources.ping() return } // We have to setup const sources = new UIEventSource([src]) this.sources.set(index, sources) const merger = new FeatureSourceMerger( this.layer, index, BBox.fromTile(...Tiles.tile_from_index(index)), sources ) this.loadedTiles.set(index, merger) this._handleTile(merger, index) } }