TITLE: Mapping GPX tracks from AAT for Android, in R DATE: 2018-04-28 AUTHOR: John L. Godlee ==================================================================== I stopped using Strava to track my cycle rides, because I didn't feel comfortable giving away all that GPS data to a third party. I know lots of other things I do give away my location, but this is a small step in the right direction. It also prompted me to play with new GPS tracking apps. The one I have settled on is called AAT, which is a lovely brutalist piece of open source software that is designed around tracking cycling. [AAT]: https://f-droid.org/en/packages/ch.bailu.aat/ It stores tracks as GPX files, which can then be manipulated and plotted in other softwares. In this case, I wanted to use R. The script is below and here and an example GPX file from AAT can be found here. [here](https://johngodlee.xyz/files/gpx/import_gpx_tracks.R) [1](https://johngodlee.xyz/files/gpx/2018_04_19_0.gpx) Note that you may have to install ggmap from the github repository like this: devtools::install_github("dkahle/ggmap"), as the CRAN mirror is often way behind. # Packages ---- library(rgdal) # readOGR(), ogrListLayers() library(ggplot2) # ggplot() library(ggmap) # get_map(), ggmap() # setwd ---- setwd("~/tracks") # Import file ---- # Find out what layers are in the file (layers <- ogrListLayers("2018_04_19_0.gpx")) # Import the points layer, which contains elevation data track_points <- readOGR("2018_04_19_0.gpx", layer = layers[5]) # Import the tracks layer as a spatiallinesdataframe # Test plot plot(track_points) # Transform data to data frame for plotting ---- # Create data frame from spatial object track_df <- data.frame(track_points@coords, track_points$ele, track_points$time, track_points$track_seg_point_id) # Rename columns names(track_df) <- c("lon", "lat", "elev", "time", "seg_id") # Convert time to posixCT track_df$time_posix <- track_df$time %>% as.POSIXct(., format = "%Y/%m/%d %H:%M:%S ") # Create plots ---- # Create elevation plot (elev_plot <- ggplot(track_df, aes(x = time_posix, y = elev)) + geom_point() + geom_smooth(method = "loess", span = 0.1) + scale_x_datetime() + theme_classic() + xlab("Elevation (m)") + ylab("Time")) # Plot map using ggmap goog_map <- get_map(location = track_points@bbox, zoom = 15, maptype = "roadmap", color = "bw") (route_map <- ggmap(goog_map) + geom_path(data = track_df, aes(colour = elev), size = 1.5) + scale_color_gradientn(colours = rainbow(4)) + guides(colour = guide_colourbar(title="Elevation (m)")) + xlab("Longitude") + ylab("Latitude")) The script outputs an elevation plot and a map which shows the track, coloured by elevation. ![Elevation profile](https://johngodlee.xyz/img_full/gpx/elev_plot.png) ![Route map](https://johngodlee.xyz/img_full/gpx/route_map.png)