Saya bekerja dengan grup bersepeda lokal kami untuk menganonimkan file GPX pada dua kriteria (terutama untuk keamanan). Saya tidak pernah menemukan cara standar untuk menganonimkan data tetapi ini memuaskan dua kekhawatiran anggota kami, sambil menjaga akurasi di sepanjang jalan dan mempercepat informasi:
- Lokasi pribadi, menghapus area 'pribadi' untuk individu;
- Mengaburkan cap waktu sehingga data perjalanan tidak dapat digunakan untuk mengidentifikasi gerakan individu.
GPSBabel dapat melakukan keduanya dari baris perintah - misalnya, untuk menggeser waktu dalam file GPX dengan +123450 detik, dan menghapus semua trackpoint berjarak 0,5 km dari tengara di Tanzania utara:
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
: hanya memproses trek;
-i
, -f
: input tipe file (gpx) dan nama file;
-x
: dua argumen filter berurutan (-x) untuk pergeseran timeshift (bergerak) dan penghapusan (radius, kecualikan) di sekitar titik;
-o
, -F
: jenis file keluaran dan nama file.
Perintah ini menyatukan beberapa filter - pertama mentransformasikan trackpoint menjadi waypoint, lalu memfilter, lalu mentransformasikan kembali ke trackpoint.
Perhatikan bahwa mengurangi tempat desimal di sekitar landmark / area privasi SANGAT penting karena mengaburkan pusat tepat area privasi. 3 tempat desimal = ~ 110m akurasi dalam hal ini.
Saya biasanya memanggil GPSBabel dari R, menulis file GPX baru dengan filter yang diterapkan, termasuk + timeshift acak +/- 2 minggu. Ini akan lebih baik sebagai skrip bash atau python tetapi banyak pekerjaan lain yang saya lakukan adalah di R dan saya malas ...
# 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)