| 
									
										
										
										
											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 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) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |