forked from MapComplete/MapComplete
		
	Velopark: add report generating script
This commit is contained in:
		
							parent
							
								
									2583feef65
								
							
						
					
					
						commit
						8be41571fa
					
				
					 2 changed files with 90 additions and 11 deletions
				
			
		
							
								
								
									
										72
									
								
								scripts/velopark/compare.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								scripts/velopark/compare.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | ||||||
|  | import Script from "../Script" | ||||||
|  | import fs from "fs" | ||||||
|  | import { Feature, FeatureCollection } from "geojson" | ||||||
|  | import { GeoOperations } from "../../src/Logic/GeoOperations" | ||||||
|  | import * as os from "os" | ||||||
|  | // vite-node scripts/velopark/compare.ts -- scripts/velopark/velopark_all_2024-02-14T12\:18\:41.772Z.geojson ~/Projecten/OSM/Fietsberaad/2024-02-02\ Fietsenstallingen_OSM_met_velopark_ref.geojson
 | ||||||
|  | class Compare extends Script { | ||||||
|  | 
 | ||||||
|  |     compare(veloId: string, osmParking: Feature, veloParking: Feature): {distance: number, ref: string, osmid: string, diffs: { | ||||||
|  |         osm: string, velopark: string, key: string | ||||||
|  |         }[] }{ | ||||||
|  |         const osmCenterpoint = GeoOperations.centerpointCoordinates(osmParking) | ||||||
|  |         const veloparkCenterpoint = GeoOperations.centerpointCoordinates(veloParking) | ||||||
|  |         const distance = Math.round(GeoOperations.distanceBetween(osmCenterpoint, veloparkCenterpoint)) | ||||||
|  |         const diffs: { osm: string, velopark: string, key: string}[] = [] | ||||||
|  | 
 | ||||||
|  |         const allKeys = new Set<string>(Object.keys(osmParking.properties).concat(Object.keys(veloParking.properties))) | ||||||
|  |         for (const key of allKeys) { | ||||||
|  |             if(osmParking.properties[key] === veloParking.properties[key]){ | ||||||
|  |                 continue | ||||||
|  |             } | ||||||
|  |             if(Number(osmParking.properties[key]) === veloParking.properties[key]){ | ||||||
|  |                 continue | ||||||
|  |             } | ||||||
|  |             if(veloParking.properties[key] === undefined){ | ||||||
|  |                 continue | ||||||
|  |             } | ||||||
|  |             diffs.push({ | ||||||
|  |                 key, | ||||||
|  |                 osm: osmParking.properties[key], | ||||||
|  |                 velopark: veloParking.properties[key] | ||||||
|  |             }) | ||||||
|  |         } | ||||||
|  |         return { | ||||||
|  |             ref: veloId, | ||||||
|  |             osmid: osmParking.properties["@id"], | ||||||
|  |             distance, diffs | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     async main(args: string[]): Promise<void> { | ||||||
|  |         let [velopark, osm, key] = args | ||||||
|  |         key ??= "ref:velopark" | ||||||
|  |         const veloparkData: FeatureCollection = JSON.parse(fs.readFileSync(velopark, "utf-8")) | ||||||
|  |         const osmData : FeatureCollection = JSON.parse(fs.readFileSync(osm, "utf-8")) | ||||||
|  | 
 | ||||||
|  |         const veloparkById : Record<string, Feature> = {} | ||||||
|  |         for (const parking of veloparkData.features) { | ||||||
|  |             veloparkById[parking.properties[key]] = parking | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const diffs = [] | ||||||
|  |         for (const parking of osmData.features) { | ||||||
|  |             const veloId = parking.properties[key] | ||||||
|  |             const veloparking = veloparkById[veloId] | ||||||
|  |             if(veloparking === undefined){ | ||||||
|  |                 console.error("No velopark entry found for", veloId) | ||||||
|  |                 continue | ||||||
|  |             } | ||||||
|  |            diffs.push(this.compare(veloId, parking, veloparking)) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         fs.writeFileSync("report_diff.json",JSON.stringify(diffs)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     constructor() { | ||||||
|  |         super("Compares a velopark geojson with OSM geojson. Usage: `compare velopark.geojson osm.geojson [key-to-compare-on]`. If key-to-compare-on is not given, `ref:velopark` will be used") | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | new Compare().run() | ||||||
|  | @ -15,6 +15,20 @@ class VeloParkToGeojson extends Script { | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     exportTo(filename: string, features){ | ||||||
|  |         fs.writeFileSync( | ||||||
|  |             filename+"_" + new Date().toISOString() + ".geojson", | ||||||
|  |             JSON.stringify( | ||||||
|  |                 { | ||||||
|  |                     type: "FeatureCollection", | ||||||
|  |                     features, | ||||||
|  |                 }, | ||||||
|  |                 null, | ||||||
|  |                 "    " | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     async main(args: string[]): Promise<void> { |     async main(args: string[]): Promise<void> { | ||||||
|         console.log("Downloading velopark data") |         console.log("Downloading velopark data") | ||||||
|         // Download data for NIS-code 1000. 1000 means: all of belgium
 |         // Download data for NIS-code 1000. 1000 means: all of belgium
 | ||||||
|  | @ -38,12 +52,15 @@ class VeloParkToGeojson extends Script { | ||||||
|         ) |         ) | ||||||
|         console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref") |         console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref") | ||||||
|         const allVelopark = data.map((f) => VeloparkLoader.convert(f)) |         const allVelopark = data.map((f) => VeloparkLoader.convert(f)) | ||||||
|  |         this.exportTo("velopark_all", allVelopark) | ||||||
|  | 
 | ||||||
|         const features = allVelopark.filter((f) => !seenIds.has(f.properties["ref:velopark"])) |         const features = allVelopark.filter((f) => !seenIds.has(f.properties["ref:velopark"])) | ||||||
| 
 | 
 | ||||||
|         const allProperties = new Set<string>() |         const allProperties = new Set<string>() | ||||||
|         for (const feature of features) { |         for (const feature of features) { | ||||||
|             Object.keys(feature.properties).forEach((k) => allProperties.add(k)) |             Object.keys(feature.properties).forEach((k) => allProperties.add(k)) | ||||||
|         } |         } | ||||||
|  |         this.exportTo("velopark_noncynced",features) | ||||||
|         allProperties.delete("ref:velopark") |         allProperties.delete("ref:velopark") | ||||||
|         for (const feature of features) { |         for (const feature of features) { | ||||||
|             allProperties.forEach((k) => { |             allProperties.forEach((k) => { | ||||||
|  | @ -51,17 +68,7 @@ class VeloParkToGeojson extends Script { | ||||||
|             }) |             }) | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         fs.writeFileSync( |         this.exportTo("velopark_nonsynced_id_only", features) | ||||||
|             "velopark_id_only_export_" + new Date().toISOString() + ".geojson", |  | ||||||
|             JSON.stringify( |  | ||||||
|                 { |  | ||||||
|                     type: "FeatureCollection", |  | ||||||
|                     features, |  | ||||||
|                 }, |  | ||||||
|                 null, |  | ||||||
|                 "    " |  | ||||||
|             ) |  | ||||||
|         ) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue