| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | import { OsmCreateAction, PreviewableAction } from "./OsmChangeAction" | 
					
						
							|  |  |  | import { Tag } from "../../Tags/Tag" | 
					
						
							|  |  |  | import { Changes } from "../Changes" | 
					
						
							|  |  |  | import { ChangeDescription } from "./ChangeDescription" | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  | import CreateNewWayAction from "./CreateNewWayAction" | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | import CreateWayWithPointReuseAction, { MergePointConfig } from "./CreateWayWithPointReuseAction" | 
					
						
							|  |  |  | import { And } from "../../Tags/And" | 
					
						
							|  |  |  | import { TagUtils } from "../../Tags/TagUtils" | 
					
						
							|  |  |  | import { FeatureSource, IndexedFeatureSource } from "../../FeatureSource/FeatureSource" | 
					
						
							|  |  |  | import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig" | 
					
						
							|  |  |  | import { Position } from "geojson" | 
					
						
							|  |  |  | import FullNodeDatabaseSource from "../../FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | export default class CreateMultiPolygonWithPointReuseAction | 
					
						
							|  |  |  |     extends OsmCreateAction | 
					
						
							|  |  |  |     implements PreviewableAction | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |     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[], | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |         outerRingCoordinates: Position[], | 
					
						
							|  |  |  |         innerRingsCoordinates: Position[][], | 
					
						
							|  |  |  |         state: { | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |             layout: LayoutConfig | 
					
						
							|  |  |  |             changes: Changes | 
					
						
							|  |  |  |             indexedFeatures: IndexedFeatureSource | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |             fullNodeDatabase?: FullNodeDatabaseSource | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |         this.theme = state?.layout?.id ?? "" | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         this.createOuterWay = new CreateWayWithPointReuseAction( | 
					
						
							|  |  |  |             [], | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |             <[number, number][]>outerRingCoordinates, | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             state, | 
					
						
							|  |  |  |             config | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         this.createInnerWays = innerRingsCoordinates.map( | 
					
						
							|  |  |  |             (ringCoordinates) => | 
					
						
							|  |  |  |                 new CreateNewWayAction( | 
					
						
							|  |  |  |                     [], | 
					
						
							|  |  |  |                     ringCoordinates.map(([lon, lat]) => ({ lat, lon })), | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |                     { theme: state?.layout?.id } | 
					
						
							| 
									
										
										
										
											2022-02-22 14:13:41 +01:00
										 |  |  |                 ) | 
					
						
							| 
									
										
										
										
											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], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> { | 
					
						
							|  |  |  |         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 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     getPreview(): Promise<FeatureSource> { | 
					
						
							|  |  |  |         return undefined | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-10 04:00:02 +01:00
										 |  |  | } |