Je travaille avec notre groupe cycliste local pour anonymiser les fichiers GPX sur deux critères (principalement pour la sécurité). Je n'ai jamais rencontré de méthode standard d'anonymisation des données mais cela répond à deux préoccupations de nos membres, tout en préservant la précision le long des routes et les informations de vitesse:
- Emplacements personnels, suppression des zones «privées» pour les particuliers;
- Obscurcir les horodatages afin que les données de voyage ne puissent pas être utilisées pour identifier les mouvements individuels.
GPSBabel peut effectuer ces deux opérations à partir de la ligne de commande - par exemple, pour décaler les heures dans un fichier GPX de +123450 secondes et supprimer tous les points de suivi à 0,5 km d'un point de repère dans le nord de la Tanzanie:
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
: traiter uniquement les pistes;
-i
, -f
: type de fichier d'entrée (gpx) et nom de fichier;
-x
: deux arguments de filtre séquentiels (-x) pour le décalage temporel (déplacement) et la suppression (rayon, exclusion) autour d'un point;
-o
, -F
: type et nom du fichier de sortie.
Cette commande enchaîne plusieurs filtres - transformant d'abord les points de cheminement en points de cheminement, puis filtrant, puis reconvertissant en points de cheminement.
Notez que la réduction des décimales autour du point de repère / de la zone de confidentialité est TRÈS importante car elle masque le centre exact de la zone de confidentialité. 3 décimales = précision de ~ 110 m dans ce cas.
J'appelle généralement GPSBabel à partir de R, en écrivant un nouveau fichier GPX avec des filtres appliqués, y compris un décalage temporel aléatoire de +/- 2 semaines. Ce serait mieux en tant que script bash ou python mais beaucoup d'autres travaux que je fais sont en R et je suis paresseux ...
# 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)