| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  | import Script from "../Script" | 
					
						
							|  |  |  | import { Utils } from "../../src/Utils" | 
					
						
							|  |  |  | import VeloparkLoader, { VeloparkData } from "../../src/Logic/Web/VeloparkLoader" | 
					
						
							|  |  |  | import fs from "fs" | 
					
						
							|  |  |  | import { Overpass } from "../../src/Logic/Osm/Overpass" | 
					
						
							|  |  |  | import { RegexTag } from "../../src/Logic/Tags/RegexTag" | 
					
						
							|  |  |  | import Constants from "../../src/Models/Constants" | 
					
						
							|  |  |  | import { ImmutableStore } from "../../src/Logic/UIEventSource" | 
					
						
							|  |  |  | import { BBox } from "../../src/Logic/BBox" | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  | class VeloParkToGeojson extends Script { | 
					
						
							|  |  |  |     constructor() { | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |         super( | 
					
						
							|  |  |  |             "Downloads the latest Velopark data and converts it to a geojson, which will be saved at the current directory" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  |     exportTo(filename: string, features) { | 
					
						
							| 
									
										
										
										
											2024-02-15 01:07:50 +01:00
										 |  |  |         fs.writeFileSync( | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  |             filename + "_" + new Date().toISOString() + ".geojson", | 
					
						
							| 
									
										
										
										
											2024-02-15 01:07:50 +01:00
										 |  |  |             JSON.stringify( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     type: "FeatureCollection", | 
					
						
							|  |  |  |                     features, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 null, | 
					
						
							|  |  |  |                 "    " | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |     async main(args: string[]): Promise<void> { | 
					
						
							|  |  |  |         console.log("Downloading velopark data") | 
					
						
							|  |  |  |         // Download data for NIS-code 1000. 1000 means: all of belgium
 | 
					
						
							|  |  |  |         const url = "https://www.velopark.be/api/parkings/1000" | 
					
						
							|  |  |  |         const data = <VeloparkData[]>await Utils.downloadJson(url) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |         const bboxBelgium = new BBox([ | 
					
						
							|  |  |  |             [2.51357303225, 49.5294835476], | 
					
						
							|  |  |  |             [6.15665815596, 51.4750237087], | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |         const alreadyLinkedQuery = new Overpass( | 
					
						
							|  |  |  |             new RegexTag("ref:velopark", /.+/), | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |             [], | 
					
						
							|  |  |  |             Constants.defaultOverpassUrls[0], | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |             new ImmutableStore(60 * 5), | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |             false | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |         const alreadyLinkedFeatures = await alreadyLinkedQuery.queryGeoJson(bboxBelgium) | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |         const seenIds = new Set<string>( | 
					
						
							|  |  |  |             alreadyLinkedFeatures[0].features.map((f) => f.properties["ref:velopark"]) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref") | 
					
						
							|  |  |  |         const allVelopark = data.map((f) => VeloparkLoader.convert(f)) | 
					
						
							| 
									
										
										
										
											2024-02-15 01:07:50 +01:00
										 |  |  |         this.exportTo("velopark_all", allVelopark) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |         const features = allVelopark.filter((f) => !seenIds.has(f.properties["ref:velopark"])) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const allProperties = new Set<string>() | 
					
						
							|  |  |  |         for (const feature of features) { | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |             Object.keys(feature.properties).forEach((k) => allProperties.add(k)) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  |         this.exportTo("velopark_noncynced", features) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |         allProperties.delete("ref:velopark") | 
					
						
							|  |  |  |         for (const feature of features) { | 
					
						
							| 
									
										
										
										
											2024-01-17 18:08:14 +01:00
										 |  |  |             allProperties.forEach((k) => { | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |                 delete feature.properties[k] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-15 01:07:50 +01:00
										 |  |  |         this.exportTo("velopark_nonsynced_id_only", features) | 
					
						
							| 
									
										
										
										
											2024-01-16 04:07:02 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | new VeloParkToGeojson().run() |