| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  | import TileHierarchy from "./TileHierarchy"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  | import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource"; | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  | import FilteredLayer from "../../../Models/FilteredLayer"; | 
					
						
							|  |  |  | import FeatureSourceMerger from "../Sources/FeatureSourceMerger"; | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  | import {Tiles} from "../../../Models/TileRange"; | 
					
						
							| 
									
										
										
										
											2021-09-28 17:30:48 +02:00
										 |  |  | import {BBox} from "../../BBox"; | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class TileHierarchyMerger implements TileHierarchy<FeatureSourceForLayer & Tiled> { | 
					
						
							|  |  |  |     public readonly loadedTiles: Map<number, FeatureSourceForLayer & Tiled> = new Map<number, FeatureSourceForLayer & Tiled>(); | 
					
						
							|  |  |  |     public readonly layer: FilteredLayer; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private readonly sources: Map<number, UIEventSource<FeatureSource[]>> = new Map<number, UIEventSource<FeatureSource[]>>(); | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |     private _handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource, index: number) => void; | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |     constructor(layer: FilteredLayer, handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource & Tiled, index: number) => void) { | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  |         this.layer = layer; | 
					
						
							|  |  |  |         this._handleTile = handleTile; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add another feature source for the given tile. | 
					
						
							|  |  |  |      * Entries for this tile will be merged | 
					
						
							|  |  |  |      * @param src | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public registerTile(src: FeatureSource & Tiled) { | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         const index = src.tileIndex | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         const merger = new FeatureSourceMerger(this.layer, index, BBox.fromTile(...Tiles.tile_from_index(index)), sources) | 
					
						
							| 
									
										
										
										
											2021-09-21 01:47:58 +02:00
										 |  |  |         this.loadedTiles.set(index, merger) | 
					
						
							|  |  |  |         this._handleTile(merger, index) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |