Współpracuję z naszą lokalną grupą rowerową w celu anonimizacji plików GPX według dwóch kryteriów (przede wszystkim bezpieczeństwa). Nigdy nie spotkałem się ze standardową metodą anonimizacji danych, ale spełnia to dwa obawy naszych członków, przy jednoczesnym zachowaniu dokładności na drogach i informacji o prędkości:
- Lokalizacje osobiste, usuwające „prywatne” obszary dla osób fizycznych;
- Przesłaniają znaczniki czasu, aby dane podróży nie mogły zostać użyte do identyfikacji poszczególnych ruchów.
GPSBabel może wykonać oba te operacje z wiersza poleceń - na przykład, aby przesunąć czasy w pliku GPX o +123450 sekund i usunąć wszystkie punkty trasy w odległości 0,5 km od punktu orientacyjnego w północnej Tanzanii:
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
: tylko ścieżki procesowe;
-i
, -f
: typ pliku wejściowego (gpx) i nazwa pliku;
-x
: dwa sekwencyjne (-x) argumenty filtru dla przesunięcia czasowego (przesunięcie) i usunięcia (promień, wykluczenie) wokół punktu;
-o
, -F
: typ pliku wyjściowego i nazwa pliku.
To polecenie łączy ze sobą kilka filtrów - najpierw przekształcając punkty trasy w punkty drogi, następnie filtrując, a następnie przekształcając z powrotem do punktów drogi.
Pamiętaj, że zmniejszenie miejsc dziesiętnych wokół punktu orientacyjnego / obszaru prywatności jest BARDZO ważne, ponieważ zasłania dokładny środek obszaru prywatności. 3 miejsca dziesiętne = w tym przypadku dokładność ~ 110 m .
Zazwyczaj dzwonię do GPSBabel z R, pisząc nowy plik GPX z zastosowanymi filtrami, w tym losową przesunięciem czasu +/- 2 tygodnie. Byłoby lepiej jako skrypt bash lub python, ale wiele innych prac, które wykonuję, to R i jestem leniwy ...
# 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)