| 
									
										
										
										
											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
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import { Store } from "../../UIEventSource" | 
					
						
							|  |  |  | import { GeoOperations } from "../../GeoOperations" | 
					
						
							|  |  |  | import FeatureSource from "../FeatureSource" | 
					
						
							|  |  |  | import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig" | 
					
						
							|  |  |  | import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" | 
					
						
							|  |  |  | import LineRenderingConfig from "../../../Models/ThemeConfig/LineRenderingConfig" | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class RenderingMultiPlexerFeatureSource { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     public readonly features: Store< | 
					
						
							|  |  |  |         (any & { | 
					
						
							|  |  |  |             pointRenderingIndex: number | undefined | 
					
						
							|  |  |  |             lineRenderingIndex: number | undefined | 
					
						
							|  |  |  |         })[] | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |     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[] | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |         if (feat.geometry.type === "Point") { | 
					
						
							|  |  |  |             for (const rendering of this.pointRenderings) { | 
					
						
							|  |  |  |                 withIndex.push({ | 
					
						
							|  |  |  |                     ...feat, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     pointRenderingIndex: rendering.index, | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                 }) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // This is a a line: add the centroids
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             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 | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             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) | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                 for (const rendering of this.projectedCentroidRenderings) { | 
					
						
							|  |  |  |                     addAsPoint(feat, rendering, centerpoint) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             // AT last, add it 'as is' to what we should render
 | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |             for (let i = 0; i < this.lineRenderObjects.length; i++) { | 
					
						
							|  |  |  |                 withIndex.push({ | 
					
						
							|  |  |  |                     ...feat, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     lineRenderingIndex: i, | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |                 }) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |     constructor(upstream: FeatureSource, layer: LayerConfig) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const pointRenderObjects: { rendering: PointRenderingConfig; index: number }[] = | 
					
						
							|  |  |  |             layer.mapRendering.map((r, i) => ({ | 
					
						
							|  |  |  |                 rendering: r, | 
					
						
							|  |  |  |                 index: i, | 
					
						
							|  |  |  |             })) | 
					
						
							|  |  |  |         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 | 
					
						
							| 
									
										
										
										
											2022-06-21 22:56:14 +02:00
										 |  |  |         this.lineRenderObjects = layer.lineRendering | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.features = upstream.features.map((features) => { | 
					
						
							|  |  |  |             if (features === undefined) { | 
					
						
							|  |  |  |                 return undefined | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const withIndex: any[] = [] | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             function addAsPoint(feat, rendering, coordinate) { | 
					
						
							|  |  |  |                 const patched = { | 
					
						
							|  |  |  |                     ...feat, | 
					
						
							|  |  |  |                     pointRenderingIndex: rendering.index, | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 patched.geometry = { | 
					
						
							|  |  |  |                     type: "Point", | 
					
						
							|  |  |  |                     coordinates: coordinate, | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 withIndex.push(patched) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-09 18:41:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             for (const f of features) { | 
					
						
							|  |  |  |                 const feat = f.feature | 
					
						
							|  |  |  |                 if (feat === undefined) { | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 this.inspectFeature(feat, addAsPoint, withIndex) | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return withIndex | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |