| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  | import { OsmCreateAction } from "./OsmChangeAction" | 
					
						
							|  |  |  | import { Tag } from "../../Tags/Tag" | 
					
						
							|  |  |  | import { Changes } from "../Changes" | 
					
						
							|  |  |  | import { ChangeDescription } from "./ChangeDescription" | 
					
						
							|  |  |  | import FeaturePipelineState from "../../State/FeaturePipelineState" | 
					
						
							|  |  |  | import FeatureSource from "../../FeatureSource/FeatureSource" | 
					
						
							|  |  |  | import CreateNewWayAction from "./CreateNewWayAction" | 
					
						
							|  |  |  | import CreateWayWithPointReuseAction, { MergePointConfig } from "./CreateWayWithPointReuseAction" | 
					
						
							|  |  |  | import { And } from "../../Tags/And" | 
					
						
							|  |  |  | import { TagUtils } from "../../Tags/TagUtils" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAction { | 
					
						
							|  |  |  |     public newElementId: string = undefined | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |     public newElementIdNumber: number = undefined | 
					
						
							|  |  |  |     private readonly _tags: Tag[] | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |     private readonly createOuterWay: CreateWayWithPointReuseAction | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |     private readonly createInnerWays: CreateNewWayAction[] | 
					
						
							|  |  |  |     private readonly geojsonPreview: any | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |     private readonly theme: string | 
					
						
							|  |  |  |     private readonly changeType: "import" | "create" | string | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |     constructor( | 
					
						
							|  |  |  |         tags: Tag[], | 
					
						
							|  |  |  |         outerRingCoordinates: [number, number][], | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         innerRingsCoordinates: [number, number][][], | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |         state: FeaturePipelineState, | 
					
						
							|  |  |  |         config: MergePointConfig[], | 
					
						
							|  |  |  |         changeType: "import" | "create" | string | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         super(null, true) | 
					
						
							|  |  |  |         this._tags = [...tags, new Tag("type", "multipolygon")] | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |         this.changeType = changeType | 
					
						
							| 
									
										
										
										
											2022-02-22 14:13:41 +01:00
										 |  |  |         this.theme = state?.layoutToUse?.id ?? "" | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         this.createOuterWay = new CreateWayWithPointReuseAction( | 
					
						
							|  |  |  |             [], | 
					
						
							|  |  |  |             outerRingCoordinates, | 
					
						
							|  |  |  |             state, | 
					
						
							|  |  |  |             config | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         this.createInnerWays = innerRingsCoordinates.map( | 
					
						
							|  |  |  |             (ringCoordinates) => | 
					
						
							|  |  |  |                 new CreateNewWayAction( | 
					
						
							|  |  |  |                     [], | 
					
						
							|  |  |  |                     ringCoordinates.map(([lon, lat]) => ({ lat, lon })), | 
					
						
							| 
									
										
										
										
											2022-02-22 14:13:41 +01:00
										 |  |  |                     { theme: state?.layoutToUse?.id } | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         this.geojsonPreview = { | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |             type: "Feature", | 
					
						
							|  |  |  |             properties: TagUtils.changeAsProperties(new And(this._tags).asChange({})), | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             geometry: { | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |                 type: "Polygon", | 
					
						
							|  |  |  |                 coordinates: [outerRingCoordinates, ...innerRingsCoordinates], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public async getPreview(): Promise<FeatureSource> { | 
					
						
							|  |  |  |         const outerPreview = await this.createOuterWay.getPreview() | 
					
						
							|  |  |  |         outerPreview.features.data.push({ | 
					
						
							|  |  |  |             freshness: new Date(), | 
					
						
							|  |  |  |             feature: this.geojsonPreview, | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         return outerPreview | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> { | 
					
						
							|  |  |  |         console.log("Running CMPWPRA") | 
					
						
							|  |  |  |         const descriptions: ChangeDescription[] = [] | 
					
						
							|  |  |  |         descriptions.push(...(await this.createOuterWay.CreateChangeDescriptions(changes))) | 
					
						
							|  |  |  |         for (const innerWay of this.createInnerWays) { | 
					
						
							|  |  |  |             descriptions.push(...(await innerWay.CreateChangeDescriptions(changes))) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.newElementIdNumber = changes.getNewID() | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         this.newElementId = "relation/" + this.newElementIdNumber | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |         descriptions.push({ | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             type: "relation", | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |             id: this.newElementIdNumber, | 
					
						
							|  |  |  |             tags: new And(this._tags).asChange({}), | 
					
						
							|  |  |  |             meta: { | 
					
						
							|  |  |  |                 theme: this.theme, | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                 changeType: this.changeType, | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |             }, | 
					
						
							|  |  |  |             changes: { | 
					
						
							|  |  |  |                 members: [ | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         type: "way", | 
					
						
							|  |  |  |                         ref: this.createOuterWay.newElementIdNumber, | 
					
						
							|  |  |  |                         role: "outer", | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                     // @ts-ignore
 | 
					
						
							|  |  |  |                     ...this.createInnerWays.map((a) => ({ | 
					
						
							|  |  |  |                         type: "way", | 
					
						
							|  |  |  |                         ref: a.newElementIdNumber, | 
					
						
							|  |  |  |                         role: "inner", | 
					
						
							|  |  |  |                     })), | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |         return descriptions | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |