Ich arbeite mit unserer lokalen Fahrradgruppe zusammen, um GPX-Dateien nach zwei Kriterien zu anonymisieren (hauptsächlich aus Sicherheitsgründen). Ich bin noch nie auf eine Standardmethode zur Anonymisierung von Daten gestoßen, aber dies befriedigt zwei Bedenken unserer Mitglieder, während die Genauigkeit auf Straßen und die Geschwindigkeitsinformationen erhalten bleiben:
- Persönliche Standorte, Entfernen von "privaten" Bereichen für Einzelpersonen;
- Verschleierung von Zeitstempeln, sodass Reisedaten nicht zur Identifizierung einzelner Bewegungen verwendet werden können.
GPSBabel kann beides über die Befehlszeile ausführen, um beispielsweise die Zeiten in einer GPX-Datei um +123450 Sekunden zu verschieben und alle Trackpoints zu entfernen, die 0,5 km von einem Wahrzeichen im Norden Tansanias entfernt sind:
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
: nur Tracks verarbeiten;
-i
, -f
: Eingabedateityp (gpx) und Dateiname;
-x
: zwei aufeinanderfolgende (-x) Filterargumente für Timeshift (Verschieben) und Entfernen (Radius, Ausschließen) um einen Punkt;
-o
, -F
: Ausgabedateityp und Dateiname.
Dieser Befehl verkettet mehrere Filter - zuerst werden die Trackpoints in Wegpunkte umgewandelt, dann gefiltert und dann wieder in Trackpoints umgewandelt.
Beachten Sie, dass das Reduzieren der Dezimalstellen um den Orientierungspunkt / Datenschutzbereich SEHR wichtig ist, da dadurch die genaue Mitte des Datenschutzbereichs verdeckt wird. 3 Dezimalstellen = ~ 110 m Genauigkeit in diesem Fall.
Normalerweise rufe ich GPSBabel von R aus an und schreibe eine neue GPX-Datei mit angewendeten Filtern, einschließlich einer zufälligen Zeitverschiebung von +/- 2 Wochen. Dies wäre besser als Bash- oder Python-Skript, aber viele andere Arbeiten, die ich mache, sind in R und ich bin faul ...
# 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)