| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  | import ThemeViewState from "../Models/ThemeViewState" | 
					
						
							|  |  |  | import SvelteUIElement from "../UI/Base/SvelteUIElement" | 
					
						
							|  |  |  | import MaplibreMap from "../UI/Map/MaplibreMap.svelte" | 
					
						
							| 
									
										
										
										
											2022-10-27 01:50:01 +02:00
										 |  |  | import { Utils } from "../Utils" | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  | import { UIEventSource } from "../Logic/UIEventSource" | 
					
						
							| 
									
										
										
										
											2022-09-14 12:18:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-27 01:50:01 +02:00
										 |  |  | export interface PngMapCreatorOptions { | 
					
						
							|  |  |  |     readonly width: number | 
					
						
							|  |  |  |     readonly height: number | 
					
						
							| 
									
										
										
										
											2022-09-14 12:18:51 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-12 20:14:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class PngMapCreator { | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  |     private static id = 0 | 
					
						
							| 
									
										
										
										
											2022-10-27 01:50:01 +02:00
										 |  |  |     private readonly _options: PngMapCreatorOptions | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  |     private readonly _state: ThemeViewState | 
					
						
							| 
									
										
										
										
											2022-09-12 20:14:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  |     constructor(state: ThemeViewState, options: PngMapCreatorOptions) { | 
					
						
							| 
									
										
										
										
											2022-10-27 01:50:01 +02:00
										 |  |  |         this._state = state | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  |         this._options = options | 
					
						
							| 
									
										
										
										
											2022-09-12 20:14:03 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Creates a base64-encoded PNG image | 
					
						
							|  |  |  |      * @constructor | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-05-05 02:03:41 +02:00
										 |  |  |     public async CreatePng(status: UIEventSource<string>): Promise<Blob> { | 
					
						
							|  |  |  |         const div = document.createElement("div") | 
					
						
							|  |  |  |         div.id = "mapdiv-" + PngMapCreator.id | 
					
						
							|  |  |  |         PngMapCreator.id++ | 
					
						
							|  |  |  |         const layout = this._state.layout | 
					
						
							|  |  |  |         function setState(msg: string) { | 
					
						
							|  |  |  |             status.setData(layout.id + ": " + msg) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         setState("Initializing map") | 
					
						
							|  |  |  |         const map = this._state.map | 
					
						
							|  |  |  |         new SvelteUIElement(MaplibreMap, { map }) | 
					
						
							|  |  |  |             .SetStyle( | 
					
						
							|  |  |  |                 "width: " + this._options.width + "mm; height: " + this._options.height + "mm" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             .AttachTo("extradiv") | 
					
						
							|  |  |  |         setState("Waiting for the data") | 
					
						
							|  |  |  |         await this._state.dataIsLoading.AsPromise((loading) => !loading) | 
					
						
							|  |  |  |         setState("Waiting for styles to be fully loaded") | 
					
						
							|  |  |  |         while (!map?.data?.isStyleLoaded()) { | 
					
						
							|  |  |  |             await Utils.waitFor(250) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // Some extra buffer...
 | 
					
						
							|  |  |  |         await Utils.waitFor(1000) | 
					
						
							|  |  |  |         setState("Exporting png") | 
					
						
							|  |  |  |         console.log("Loading for", this._state.layout.id, "is done") | 
					
						
							|  |  |  |         return this._state.mapProperties.exportAsPng() | 
					
						
							| 
									
										
										
										
											2022-09-12 20:14:03 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |