Tôi đang làm việc với nhóm đi xe đạp địa phương của chúng tôi để ẩn danh các tệp GPX theo hai tiêu chí (chủ yếu để bảo mật). Tôi chưa bao giờ bắt gặp một cách ẩn danh dữ liệu tiêu chuẩn nhưng điều này thỏa mãn hai mối quan tâm của các thành viên của chúng tôi, trong khi vẫn giữ được độ chính xác dọc theo đường và thông tin tốc độ:
- Địa điểm cá nhân, xóa khu vực 'riêng tư' cho cá nhân;
- Che dấu thời gian để dữ liệu du lịch không thể được sử dụng để xác định các chuyển động riêng lẻ.
GPSBabel có thể thực hiện cả hai điều này từ dòng lệnh - ví dụ: để thay đổi thời gian trong tệp GPX thêm +123450 giây và xóa tất cả các điểm theo dõi cách điểm mốc 0,5 km ở phía bắc 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
: chỉ theo dõi quá trình;
-i
, -f
: loại tệp đầu vào (gpx) và tên tệp;
-x
: hai đối số bộ lọc tuần tự (-x) cho timeshift (di chuyển) và loại bỏ (bán kính, loại trừ) xung quanh một điểm;
-o
, -F
: loại tệp đầu ra và tên tệp.
Lệnh này kết hợp một số bộ lọc - đầu tiên chuyển đổi các điểm theo dõi thành các điểm mốc, sau đó lọc, sau đó chuyển đổi trở lại các điểm theo dõi.
Lưu ý rằng việc giảm các vị trí thập phân xung quanh mốc / vùng riêng tư là RẤT quan trọng vì nó che khuất trung tâm chính xác của vùng riêng tư. 3 chữ số thập phân = ~ 110m chính xác trong trường hợp này.
Tôi thường gọi GPSBabel từ R, viết tệp GPX mới với các bộ lọc được áp dụng, bao gồm cả thời gian ngẫu nhiên +/- 2 tuần. Điều này sẽ tốt hơn khi là một kịch bản bash hoặc python nhưng rất nhiều công việc khác tôi làm là trong R và tôi lười biếng ...
# 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)