forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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<FeatureSourceForLayer & Tiled> {
 | |
|     public readonly loadedTiles: Map<number, FeatureSourceForLayer & Tiled> = new Map<
 | |
|         number,
 | |
|         FeatureSourceForLayer & Tiled
 | |
|     >()
 | |
|     public readonly layer: FilteredLayer
 | |
|     private readonly sources: Map<number, UIEventSource<FeatureSource[]>> = new Map<
 | |
|         number,
 | |
|         UIEventSource<FeatureSource[]>
 | |
|     >()
 | |
|     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<FeatureSource[]>([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)
 | |
|     }
 | |
| }
 |