| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |  * Applies geometry changes from 'Changes' onto every feature of a featureSource | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-09-22 16:07:56 +02:00
										 |  |  | import { Changes } from "../../Osm/Changes" | 
					
						
							|  |  |  | import { UIEventSource } from "../../UIEventSource" | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  | import { FeatureSource, IndexedFeatureSource } from "../FeatureSource" | 
					
						
							| 
									
										
										
										
											2021-09-22 16:07:56 +02:00
										 |  |  | import { ChangeDescription, ChangeDescriptionTools } from "../../Osm/Actions/ChangeDescription" | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  | import { Feature } from "geojson" | 
					
						
							| 
									
										
										
										
											2023-05-24 02:16:04 +02:00
										 |  |  | import {Utils} from "../../../Utils"; | 
					
						
							| 
									
										
										
										
											2021-09-22 16:07:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  | export default class ChangeGeometryApplicator implements FeatureSource { | 
					
						
							|  |  |  |     public readonly features: UIEventSource<Feature[]> = new UIEventSource<Feature[]>([]) | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |     private readonly source: IndexedFeatureSource | 
					
						
							|  |  |  |     private readonly changes: Changes | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  |     constructor(source: IndexedFeatureSource, changes: Changes) { | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         this.source = source | 
					
						
							|  |  |  |         this.changes = changes | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  |         this.features = new UIEventSource<Feature[]>(undefined) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-18 14:52:09 +02:00
										 |  |  |         const self = this | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         source.features.addCallbackAndRunD((_) => self.update()) | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         changes.allChanges.addCallbackAndRunD((_) => self.update()) | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |     private update() { | 
					
						
							|  |  |  |         const upstreamFeatures = this.source.features.data | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  |         const upstreamIds = this.source.featuresById.data | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         const changesToApply = this.changes.allChanges.data?.filter( | 
					
						
							|  |  |  |             (ch) => | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  |                 // Does upstream have this element? If not, we skip
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |                 upstreamIds.has(ch.type + "/" + ch.id) && | 
					
						
							|  |  |  |                 // Are any (geometry) changes defined?
 | 
					
						
							|  |  |  |                 ch.changes !== undefined && | 
					
						
							|  |  |  |                 // Ignore new elements, they are handled by the NewGeometryFromChangesFeatureSource
 | 
					
						
							|  |  |  |                 ch.id > 0 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (changesToApply === undefined || changesToApply.length === 0) { | 
					
						
							|  |  |  |             // No changes to apply!
 | 
					
						
							|  |  |  |             // Pass the original feature and lets continue our day
 | 
					
						
							|  |  |  |             this.features.setData(upstreamFeatures) | 
					
						
							| 
									
										
										
										
											2021-07-18 17:50:35 +02:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         const changesPerId = new Map<string, ChangeDescription[]>() | 
					
						
							|  |  |  |         for (const ch of changesToApply) { | 
					
						
							|  |  |  |             const key = ch.type + "/" + ch.id | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (changesPerId.has(key)) { | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |                 changesPerId.get(key).push(ch) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |                 changesPerId.set(key, [ch]) | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  |         const newFeatures: Feature[] = [] | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         for (const feature of upstreamFeatures) { | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  |             const changesForFeature = changesPerId.get(feature.properties.id) | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |             if (changesForFeature === undefined) { | 
					
						
							| 
									
										
										
										
											2023-04-20 01:52:23 +02:00
										 |  |  |                 // No changes for this element - simply pass it along to downstream
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |                 newFeatures.push(feature) | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |             // Allright! We have a feature to rewrite!
 | 
					
						
							|  |  |  |             const copy = { | 
					
						
							|  |  |  |                 ...feature, | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |             // We only apply the last change as that one'll have the latest geometry
 | 
					
						
							|  |  |  |             const change = changesForFeature[changesForFeature.length - 1] | 
					
						
							| 
									
										
										
										
											2023-03-23 01:42:47 +01:00
										 |  |  |             copy.geometry = ChangeDescriptionTools.getGeojsonGeometry(change) | 
					
						
							| 
									
										
										
										
											2023-05-24 02:16:04 +02:00
										 |  |  |             if(Utils.SameObject(copy.geometry, feature.geometry)){ | 
					
						
							|  |  |  |                 // No actual changes: pass along the original
 | 
					
						
							|  |  |  |                 newFeatures.push(feature) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-02-22 14:13:41 +01:00
										 |  |  |             console.log( | 
					
						
							|  |  |  |                 "Applying a geometry change onto:", | 
					
						
							|  |  |  |                 feature, | 
					
						
							|  |  |  |                 "The change is:", | 
					
						
							|  |  |  |                 change, | 
					
						
							|  |  |  |                 "which becomes:", | 
					
						
							|  |  |  |                 copy | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |             newFeatures.push(copy) | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         this.features.setData(newFeatures) | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |