[GIS] Create GPX track in R. writeOGR function

gpxogrrrgdaltracking

I have a gpx file where someone exported two different activities in two separate locations to a single track. I need to split them and avoid getting the erroneous line in the track layer that connects the two places where they were using the GPS. I haven't found a method to cut a track at a certain spot, so my approach was to read in the track_points layer, subset for the date I was interested in, and push those points to a spatiallinesdataframe, and write the new track. I manage to write it without getting an error, but when I try to read it back again, it says there are no features in the track layer. I would be open to any solution that would split the track layer, and if anyone that is already answering this question knows how to write a 'tracks', 'track_points', and 'waypoints' layer to the same .gpx file, please include that in your answer as that will be my next step after solving this problem.

Here's what I did so far:

library(rgdal)
gpxfile<-"C:/Users/.../file.gpx"
trackpoints<-readOGR(gpxfile, layer="track_points")

library(lubridate)
trackpoints$time<-ymd_hms(trackpoints$time) 
trackpoints<-trackpoints[trackpoints$time>'2016/03/16 12:00:59+00',] #subset for the date I'm interested in

coord<-as.data.frame(coordinates(trackpoints))
lin<-Line(coord)

lin1<-Lines(list(lin), ID="track")
lin2<-SpatialLines(list(lin1))

df<-data.frame(len=sapply(1:length(lin2), function(i) gLength(lin2[i,])))
rownames(df)<-sapply(1:length(lin2), function(i) lin2@lines[[i]]@ID)

lin3<-SpatialLinesDataFrame(lin2, data=df)

proj4string(lin3)<-CRS("+proj=longlat +datum=WGS84")
names(lin3)<-"name"

writeOGR(lin3,
     dsn="C:/Users/.../newtrack.gpx", layer="tracks", driver="GPX",
     dataset_options="GPX_USE_EXTENSIONS=yes", overwrite_layer = T)

Best Answer

Figuring out the GPX driver options for rgdal is headache-inducing.

Writing a linestring as you've done here will cause it to write a route layer - if you write a multilinestring it should create a track layer. According to the documentation you should be able to make it be a track layer regardless using FORCE_GPX_TRACK=true but I've not been able to make that work with this example.

Some experimentation shows that just writing the track points will automatically create the track line as well, creating a track layer:

writeOGR(trackpoints, 
     dsn="lin3_trk.gpx", 
     layer="track_points", 
     driver = "GPX") 

enter image description here