| 
									
										
										
										
											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-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 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |