Я работаю с нашей местной велосипедной группой, чтобы анонимизировать файлы 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 недели. Это было бы лучше, как сценарий bash или python, но большая часть другой работы, которую я делаю, связана с 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)