我正在与我们的本地骑车小组合作,以两个标准(主要是出于安全性)对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位= 准确度约为110m。
我通常从R调用GPSBabel,编写一个应用了过滤器的新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)