Estoy trabajando con nuestro grupo local de ciclismo para anonimizar archivos GPX en dos criterios (principalmente por seguridad). Nunca me he encontrado con una forma estándar de anonimizar datos, pero esto satisface dos preocupaciones de nuestros miembros, al tiempo que conserva la precisión a lo largo de las carreteras y la información de velocidad:
- Ubicaciones personales, eliminación de áreas 'privadas' para individuos;
- Obscurecer las marcas de tiempo para que los datos de viaje no puedan usarse para identificar movimientos individuales.
GPSBabel puede hacer ambas cosas desde la línea de comando, por ejemplo, para cambiar los tiempos en un archivo GPX en +123450 segundos y eliminar todos los puntos de seguimiento a 0.5 km de un punto de referencia en el norte de Tanzania:
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
: solo pistas de proceso;
-i
, -f
: tipo de archivo de entrada (gpx) y nombre de archivo;
-x
: dos argumentos de filtro secuenciales (-x) para Timeshift (mover) y eliminar (radio, excluir) alrededor de un punto;
-o
, -F
: tipo de archivo de salida y nombre de archivo.
Este comando encadena varios filtros : primero transforma los puntos de seguimiento en waypoints, luego filtra y luego vuelve a transformarlos en puntos de seguimiento.
Tenga en cuenta que reducir los lugares decimales alrededor del área de referencia / privacidad es MUY importante ya que oscurece el centro exacto del área de privacidad. 3 lugares decimales = ~ 110m de precisión en este caso.
Por lo general, llamo a GPSBabel desde R, escribiendo un nuevo archivo GPX con filtros aplicados, incluido un cambio de hora aleatorio +/- 2 semanas. Esto sería mejor como un script bash o python, pero gran parte del otro trabajo que hago es en R y soy flojo ...
# 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)