forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			73 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | 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() |