2024-02-15 01:07:50 +01:00
import Script from "../Script"
import fs from "fs"
import { Feature , FeatureCollection } from "geojson"
import { GeoOperations } from "../../src/Logic/GeoOperations"
2024-04-05 17:49:31 +02:00
2024-04-13 01:31:42 +02:00
// vite-node scripts/velopark/compare.ts -- velopark_all.geojson osm_with_velopark_link_.geojson
2024-02-15 01:07:50 +01:00
class Compare extends Script {
2024-02-20 13:33:38 +01:00
compare (
veloId : string ,
osmParking : Feature ,
veloParking : Feature
) : {
distance : number
ref : string
osmid : string
diffs : {
osm : string
velopark : string
key : string
} [ ]
} {
2024-02-15 01:07:50 +01:00
const osmCenterpoint = GeoOperations . centerpointCoordinates ( osmParking )
const veloparkCenterpoint = GeoOperations . centerpointCoordinates ( veloParking )
2024-02-20 13:33:38 +01:00
const distance = Math . round (
GeoOperations . distanceBetween ( osmCenterpoint , veloparkCenterpoint )
)
const diffs : { osm : string ; velopark : string ; key : string } [ ] = [ ]
2024-02-15 01:07:50 +01:00
2024-02-20 13:33:38 +01:00
const allKeys = new Set < string > (
Object . keys ( osmParking . properties ) . concat ( Object . keys ( veloParking . properties ) )
)
2024-02-15 01:07:50 +01:00
for ( const key of allKeys ) {
2024-04-13 02:40:21 +02:00
if ( [ "name" , "numberOfLevels" ] . indexOf ( key ) >= 0 ) {
2024-04-05 17:49:31 +02:00
continue // We don't care about these tags
}
2024-02-20 13:33:38 +01:00
if ( osmParking . properties [ key ] === veloParking . properties [ key ] ) {
2024-02-15 01:07:50 +01:00
continue
}
2024-02-20 13:33:38 +01:00
if ( Number ( osmParking . properties [ key ] ) === veloParking . properties [ key ] ) {
2024-02-15 01:07:50 +01:00
continue
}
2024-02-20 13:33:38 +01:00
if ( veloParking . properties [ key ] === undefined ) {
2024-02-15 01:07:50 +01:00
continue
}
diffs . push ( {
key ,
osm : osmParking.properties [ key ] ,
2024-04-13 02:40:21 +02:00
velopark : veloParking.properties [ key ] ,
2024-02-15 01:07:50 +01:00
} )
}
2024-04-13 02:40:21 +02:00
let osmid =
osmParking . properties [ "@id" ] ? ?
osmParking [ "id" ] /*Not in the properties, that is how overpass returns it*/
2024-04-05 17:49:31 +02:00
if ( ! osmid . startsWith ( "http" ) ) {
osmid = "https://openstreetmap.org/" + osmid
}
2024-02-15 01:07:50 +01:00
return {
ref : veloId ,
2024-04-05 17:49:31 +02:00
osmid ,
2024-02-20 13:33:38 +01:00
distance ,
2024-04-13 02:40:21 +02:00
diffs ,
2024-02-15 01:07:50 +01:00
}
}
2024-04-05 17:49:31 +02:00
2024-02-15 01:07:50 +01:00
async main ( args : string [ ] ) : Promise < void > {
let [ velopark , osm , key ] = args
2024-06-16 16:06:26 +02:00
if ( velopark === undefined || osm === undefined ) {
console . log (
"Needed argument: velopark.geojson osm.geojson [key]\nThe key is optional and will be `ref:velopark` by default\nUse overpass to get a geojson with ref:velopark"
)
2024-06-14 01:01:41 +02:00
return
}
2024-02-15 01:07:50 +01:00
key ? ? = "ref:velopark"
const veloparkData : FeatureCollection = JSON . parse ( fs . readFileSync ( velopark , "utf-8" ) )
2024-02-20 13:33:38 +01:00
const osmData : FeatureCollection = JSON . parse ( fs . readFileSync ( osm , "utf-8" ) )
2024-02-15 01:07:50 +01:00
2024-02-20 13:33:38 +01:00
const veloparkById : Record < string , Feature > = { }
2024-02-15 01:07:50 +01:00
for ( const parking of veloparkData . features ) {
2024-04-05 17:49:31 +02:00
veloparkById [ parking . properties [ key ] ? ? parking . properties . url ] = parking
2024-02-15 01:07:50 +01:00
}
const diffs = [ ]
for ( const parking of osmData . features ) {
const veloId = parking . properties [ key ]
const veloparking = veloparkById [ veloId ]
2024-02-20 13:33:38 +01:00
if ( veloparking === undefined ) {
2024-02-15 01:07:50 +01:00
console . error ( "No velopark entry found for" , veloId )
continue
}
2024-06-14 01:01:41 +02:00
console . log ( "Veloparking is" , veloparking )
2024-02-20 13:33:38 +01:00
diffs . push ( this . compare ( veloId , parking , veloparking ) )
2024-02-15 01:07:50 +01:00
}
2024-04-13 02:40:21 +02:00
console . log (
"Found " ,
diffs . length ,
" items with differences between OSM and the provided data"
)
2024-04-13 01:31:42 +02:00
2024-04-13 02:40:21 +02:00
const maxDistance = Math . max ( . . . diffs . map ( ( d ) = > d . distance ) )
2024-04-13 01:31:42 +02:00
const distanceBins = [ ]
const binSize = 5
2024-04-13 02:40:21 +02:00
for ( let i = 0 ; i < Math . ceil ( maxDistance / binSize ) ; i ++ ) {
2024-04-13 01:31:42 +02:00
distanceBins . push ( 0 )
}
for ( const diff of diffs ) {
const bin = Math . floor ( diff . distance / binSize )
distanceBins [ bin ] += 1
}
fs . writeFileSync ( "report_diff.json" , JSON . stringify ( { diffs , distanceBins } , null , " " ) )
2024-04-05 17:49:31 +02:00
console . log ( "Written report_diff.json" )
2024-02-15 01:07:50 +01:00
}
2024-04-05 17:49:31 +02:00
2024-02-15 01:07:50 +01:00
constructor ( ) {
2024-02-20 13:33:38 +01:00
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"
)
2024-02-15 01:07:50 +01:00
}
}
new Compare ( ) . run ( )