Я працюю з нашою місцевою велосипедною групою, щоб анонімізувати файли GPX за двома критеріями (насамперед щодо безпеки). Я ніколи не стикався зі стандартним способом анонімізації даних, але це задовольняє дві проблеми наших членів, зберігаючи точність уздовж доріг та інформацію про швидкість:
- Особисті місця, видалення приватних зон для приватних осіб;
- Поміщення часових позначок, щоб дані про подорожі не могли використовуватися для ідентифікації окремих рухів.
GPSBabel може виконувати і те, і інше з командного рядка - наприклад, перемістити час у файлі GPX на +123450 секунд і видалити всі точки сліду в 0,5 км від орієнтиру на півночі Танзанії:
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
: обробляти лише треки;
-i
, -f
: тип вхідного файлу (gpx) та ім'я файлу;
-x
: два послідовних (-x) аргументу фільтра для переміщення часу (переміщення) та видалення (радіус, виключення) навколо точки;
-o
, -F
: тип вихідного файлу та ім'я файлу.
Ця команда поєднує в собі кілька фільтрів - спочатку перетворюючи точки доріжок у шляхові точки, потім фільтруючи, потім перетворюючи назад на точки сліду.
Зауважте, що зменшення десяткових знаків навколо орієнтиру / зони конфіденційності ДУЖЕ важливо, оскільки воно затьмарює точний центр області конфіденційності. 3 десяткових знаки = ~ 110 м точності в цьому випадку.
Зазвичай я дзвоню GPSBabel з R, записуючи новий файл GPX із застосованими фільтрами, включаючи випадковий зсув часу +/- 2 тижні. Це було б краще як баш або пітон сценарій, але багато інших робіт, які я роблю, - це R, і я лінивий ...
# 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)