| 
									
										
										
										
											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"; | 
					
						
							|  |  |  | import {FeatureSourceForLayer, IndexedFeatureSource} from "../FeatureSource"; | 
					
						
							|  |  |  | import FilteredLayer from "../../../Models/FilteredLayer"; | 
					
						
							|  |  |  | import {ChangeDescription, ChangeDescriptionTools} from "../../Osm/Actions/ChangeDescription"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  | export default class ChangeGeometryApplicator implements FeatureSourceForLayer { | 
					
						
							|  |  |  |     public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  |     public readonly name: string; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public readonly layer: FilteredLayer | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |     private readonly source: IndexedFeatureSource; | 
					
						
							|  |  |  |     private readonly changes: Changes; | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |     constructor(source: (IndexedFeatureSource & FeatureSourceForLayer), changes: Changes) { | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         this.source = source; | 
					
						
							|  |  |  |         this.changes = changes; | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         this.layer = source.layer | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         this.name = "ChangesApplied(" + source.name + ")" | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         this.features = new UIEventSource<{ feature: any; freshness: Date }[]>(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-11-07 16:34:51 +01: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 | 
					
						
							|  |  |  |         const upstreamIds = this.source.containedIds.data | 
					
						
							|  |  |  |         const changesToApply = this.changes.allChanges.data | 
					
						
							|  |  |  |             ?.filter(ch => | 
					
						
							|  |  |  |                 // Does upsteram have this element? If not, we skip
 | 
					
						
							|  |  |  |                 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
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  |         const newFeatures: { feature: any, freshness: Date }[] = [] | 
					
						
							|  |  |  |         for (const feature of upstreamFeatures) { | 
					
						
							|  |  |  |             const changesForFeature = changesPerId.get(feature.feature.properties.id) | 
					
						
							|  |  |  |             if (changesForFeature === undefined) { | 
					
						
							|  |  |  |                 // No changes for this element
 | 
					
						
							|  |  |  |                 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] | 
					
						
							|  |  |  |             copy.feature.geometry = ChangeDescriptionTools.getGeojsonGeometry(change) | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-22 05:02:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 20:47:28 +02:00
										 |  |  | } |