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)