Sto lavorando con il nostro gruppo ciclistico locale per anonimizzare i file GPX su due criteri (principalmente per la sicurezza). Non ho mai trovato un modo standard di anonimizzare i dati, ma questo soddisfa due preoccupazioni dei nostri membri, preservando l'accuratezza lungo le strade e la velocità delle informazioni:
- Posizioni personali, rimozione di aree "private" per gli individui;
- Indicatori temporali oscuranti in modo che i dati di viaggio non possano essere utilizzati per identificare i singoli movimenti.
GPSBabel può eseguire entrambe queste operazioni dalla riga di comando, ad esempio per spostare i tempi in un file GPX di +123450 secondi e rimuovere tutti i punti di traccia a 0,5 km da un punto di riferimento nel nord della Tanzania:
gpsbabel -t -i gpx -f infile.gpx \
-x transform,wpt=trk,del -x track,move=123450s \
-x radius,distance=0.5K,lat=-3.368,lon=36.624,nosort,exclude \
-x transform,trk=wpt,del \
-o gpx -F infile_rand.gpx
-t
: process track only;
-i
, -f
: tipo di file di input (gpx) e nome file;
-x
: due argomenti di filtro sequenziale (-x) per timeshift (sposta) e rimozione (raggio, escludi) attorno a un punto;
-o
, -F
: tipo di file di output e nome file.
Questo comando mette insieme diversi filtri , trasformando prima i trackpoint in waypoint, quindi filtrando, quindi trasformando nuovamente in trackpoint.
Si noti che ridurre le cifre decimali intorno all'area di riferimento / privacy è MOLTO importante in quanto oscura il centro esatto dell'area di privacy. 3 cifre decimali = ~ 110 m di precisione in questo caso.
Di solito chiamo GPSBabel da R, scrivendo un nuovo file GPX con i filtri applicati, incluso un timeshift casuale +/- 2 settimane. Sarebbe meglio come uno script bash o python, ma gran parte dell'altro lavoro che faccio è in R e sono pigro ...
# Get the correct location for GPSBabel:
GB <- Sys.which("gpsbabel")
# Set up the filters
shift <- round((runif(1, 0, 2600000) - 1300000), 0) # +/- 2 weeks in secs
filter <- " -x transform,wpt=trk,del"
filter <- paste(" -x track,move=", shift, "s", sep = "")
filter <- paste(filter, " -x radius,distance=", dist, "K,", "lat=", lat, ",long=", lon, sep = "")
filter <- paste(filter, " -x transform,wpt=trk,del", sep="")
# Pass the complete command to the system
system(paste(GB, " -t -i gpx -f ", gpx_file, filter, " -o gpx -F ",
gsub(".gpx", replacement = "_rand.gpx", x = gpx_file, fixed = T),
sep = ""), intern = TRUE)