| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2022-04-22 16:09:55 +02:00
										 |  |  |  * This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered. | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | import {UIEventSource} from "../../UIEventSource"; | 
					
						
							|  |  |  | import {GeoOperations} from "../../GeoOperations"; | 
					
						
							|  |  |  | import FeatureSource from "../FeatureSource"; | 
					
						
							|  |  |  | import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig"; | 
					
						
							|  |  |  | import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  | import LineRenderingConfig from "../../../Models/ThemeConfig/LineRenderingConfig"; | 
					
						
							|  |  |  | import {within} from "@turf/turf"; | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class RenderingMultiPlexerFeatureSource { | 
					
						
							|  |  |  |     public readonly features: UIEventSource<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>; | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |     private readonly pointRenderings: { rendering: PointRenderingConfig; index: number }[]; | 
					
						
							|  |  |  |     private centroidRenderings: { rendering: PointRenderingConfig; index: number }[]; | 
					
						
							|  |  |  |     private projectedCentroidRenderings: { rendering: PointRenderingConfig; index: number }[]; | 
					
						
							|  |  |  |     private startRenderings: { rendering: PointRenderingConfig; index: number }[]; | 
					
						
							|  |  |  |     private endRenderings: { rendering: PointRenderingConfig; index: number }[]; | 
					
						
							|  |  |  |     private hasCentroid: boolean; | 
					
						
							|  |  |  |     private lineRenderObjects: LineRenderingConfig[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private inspectFeature(feat, addAsPoint: (feat, rendering, centerpoint: [number, number]) => void, withIndex: any[]){ | 
					
						
							|  |  |  |         if (feat.geometry.type === "Point") { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (const rendering of this.pointRenderings) { | 
					
						
							|  |  |  |                 withIndex.push({ | 
					
						
							|  |  |  |                     ...feat, | 
					
						
							|  |  |  |                     pointRenderingIndex: rendering.index | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // This is a a line: add the centroids
 | 
					
						
							|  |  |  |             let centerpoint: [number, number] = undefined; | 
					
						
							|  |  |  |             let projectedCenterPoint : [number, number] = undefined | 
					
						
							|  |  |  |             if(this.hasCentroid){ | 
					
						
							|  |  |  |                 centerpoint  = GeoOperations.centerpointCoordinates(feat) | 
					
						
							|  |  |  |                 if(this.projectedCentroidRenderings.length > 0){ | 
					
						
							|  |  |  |                     projectedCenterPoint = <[number,number]> GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             for (const rendering of this.centroidRenderings) { | 
					
						
							|  |  |  |                 addAsPoint(feat, rendering, centerpoint) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (feat.geometry.type === "LineString") { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 for (const rendering of this.projectedCentroidRenderings) { | 
					
						
							|  |  |  |                     addAsPoint(feat, rendering, projectedCenterPoint) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Add start- and endpoints
 | 
					
						
							|  |  |  |                 const coordinates = feat.geometry.coordinates | 
					
						
							|  |  |  |                 for (const rendering of this.startRenderings) { | 
					
						
							|  |  |  |                     addAsPoint(feat, rendering, coordinates[0]) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 for (const rendering of this.endRenderings) { | 
					
						
							|  |  |  |                     const coordinate = coordinates[coordinates.length - 1] | 
					
						
							|  |  |  |                     addAsPoint(feat, rendering, coordinate) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 for (const rendering of this.projectedCentroidRenderings) { | 
					
						
							|  |  |  |                     addAsPoint(feat, rendering, centerpoint) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // AT last, add it 'as is' to what we should render 
 | 
					
						
							|  |  |  |             for (let i = 0; i < this.lineRenderObjects.length; i++) { | 
					
						
							|  |  |  |                 withIndex.push({ | 
					
						
							|  |  |  |                     ...feat, | 
					
						
							|  |  |  |                     lineRenderingIndex: i | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |     constructor(upstream: FeatureSource, layer: LayerConfig) { | 
					
						
							| 
									
										
										
										
											2022-04-22 16:09:55 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({ | 
					
						
							|  |  |  |             rendering: r, | 
					
						
							|  |  |  |             index: i | 
					
						
							|  |  |  |         })) | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |         this.pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point")) | 
					
						
							|  |  |  |         this.centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid")) | 
					
						
							|  |  |  |         this.projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint")) | 
					
						
							|  |  |  |         this.startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start")) | 
					
						
							|  |  |  |         this.endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end")) | 
					
						
							|  |  |  |         this.hasCentroid = this.centroidRenderings.length > 0 || this.projectedCentroidRenderings.length > 0 | 
					
						
							|  |  |  |         this.lineRenderObjects = layer.lineRendering | 
					
						
							| 
									
										
										
										
											2022-04-22 16:09:55 +02:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |         this.features = upstream.features.map( | 
					
						
							|  |  |  |             features => { | 
					
						
							|  |  |  |                 if (features === undefined) { | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                 const withIndex: any[] = []; | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 function addAsPoint(feat, rendering, coordinate) { | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                     const patched = { | 
					
						
							|  |  |  |                         ...feat, | 
					
						
							|  |  |  |                         pointRenderingIndex: rendering.index | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     patched.geometry = { | 
					
						
							|  |  |  |                         type: "Point", | 
					
						
							|  |  |  |                         coordinates: coordinate | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     withIndex.push(patched) | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |           | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 for (const f of features) { | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                    this.inspectFeature(f.feature, addAsPoint, withIndex) | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-11-09 18:41:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                 return withIndex; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |