GPX dosyalarını iki kriterde (özellikle güvenlik için) anonimleştirmek için yerel bisiklet grubumuzla çalışıyorum. Asla standart bir anonimleştirme yöntemiyle karşılaşmadım, ancak bu, yollardaki doğruluk ve hız bilgilerini korurken üyelerimizin iki endişesini tatmin ediyor:
- Bireyler için 'özel' alanların kaldırılması;
- Seyahat verilerinin bireysel hareketleri tanımlamak için kullanılamaması için zaman damgalarının gizlenmesi.
GPSBabel, her ikisini de komut satırından yapabilir - örneğin, bir GPX dosyasındaki süreleri +123450 saniye kaydırmak ve Tanzanya'nın kuzeyindeki bir dönüm noktasından 0,5 km uzaklıktaki tüm iz noktalarını kaldırmak için:
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
: yalnızca parçaları izleme;
-i
, -f
: girdi dosya türü (gpx) ve dosya adı;
-x
: bir nokta etrafında timeshift (hareket) ve kaldırma (yarıçap, hariç tutma) için iki ardışık (-x) filtre argümanı;
-o
, -F
: çıktı dosya türü ve dosya adı.
Bu komut birkaç filtreyi bir araya getirir - önce iz noktalarını geçiş noktalarına dönüştürür, sonra filtreler, ardından iz noktalarına geri dönüştürür.
Gizlilik alanının tam merkezini gizlediğinden, dönüm noktası / gizlilik alanı çevresindeki ondalık basamakları azaltmanın ÇOK önemli olduğunu unutmayın. 3 ondalık basamak = bu durumda ~ 110m doğruluk .
Genellikle rastgele bir zaman kayması +/- 2 hafta dahil filtreler uygulanmış yeni bir GPX dosyası yazarak R'den GPSBabel'ı ararım. Bu bir bash veya python betiği olarak daha iyi olurdu ama yaptığım diğer işlerin çoğu R'de ve tembelim ...
# 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)