Estou trabalhando com nosso grupo de ciclismo local para anonimizar arquivos GPX com dois critérios (principalmente por segurança). Nunca encontrei uma maneira padrão de anonimizar dados, mas isso satisfaz duas preocupações de nossos membros, preservando a precisão ao longo das estradas e agilizando as informações:
- Locais pessoais, removendo áreas 'particulares' para indivíduos;
- Carimbos de data e hora obscuros para que os dados de viagem não pudessem ser usados para identificar movimentos individuais.
O GPSBabel pode fazer ambos na linha de comando - por exemplo, para alterar os tempos em um arquivo GPX em +123450 segundos e remover todos os pontos de trilha a 0,5 km de um ponto de referência no norte da Tanzânia:
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
: processa apenas faixas;
-i
, -f
: tipo de arquivo de entrada (gpx) e nome do arquivo;
-x
: dois argumentos de filtro seqüenciais (-x) para mudança de horário (movimentação) e remoção (raio, exclusão) em torno de um ponto;
-o
, -F
: tipo de arquivo de saída e nome do arquivo.
Esse comando une vários filtros - primeiro, transformando os pontos de controle em pontos de controle , depois filtrando e depois voltando aos pontos de controle.
Observe que reduzir as casas decimais ao redor da área de referência / privacidade é MUITO importante, pois obscurece o centro exato da área de privacidade. 3 casas decimais = ~ 110m de precisão neste caso.
Eu costumo ligar para GPSBabel da R, escrevendo um novo arquivo GPX com os filtros aplicados, incluindo um desvio de tempo aleatório +/- 2 semanas. Isso seria melhor como um script bash ou python, mas muitos dos outros trabalhos que faço são em R e sou preguiçoso ...
# 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)