A couple of months ago, I bought a mobile GPS navigation device. The device makes it possible to record the routes we travel with our car. Since the routes can by exported as
.gpx files, it is rather easy to plot them using R.
To replicate this blog post, three R packages are required:
plotKML to import the data into R and
ggmap to plot the data.
library(plotKML) library(ggplot2) library(ggmap)
As a prerequisite for the installation of the
plotKML package on my Linux Mint 18.3 OS (based on Ubuntu 16.04), I needed to add the
sudo add-apt-repository ppa:ubuntugis/ppa sudo apt-get update sudo apt-get dist-upgrade
All what's required for importing the
.gpx file into R is the
readGPX() function of the
plotKML package. After importing the file into R, we receive a list (
lst.rd) conatining some meta information and one data frame. To be able to plot the GPS data using
ggplot2, we need to subset this list and save the data frame into a new object (
lst.rd <- readGPX('29 Dez. 1413.gpx') df <- lst.rd$tracks[][]
Using the head function, we have a short look on the data:
## lon lat time ## 1 12.98376 51.05915 2017-12-29T12:16:28Z ## 2 12.98377 51.05912 2017-12-29T12:16:29Z ## 3 12.98374 51.05912 2017-12-29T12:16:30Z ## 4 12.98372 51.05914 2017-12-29T12:16:31Z ## 5 12.98372 51.05914 2017-12-29T12:16:32Z ## 6 12.98372 51.05914 2017-12-29T12:16:33Z
As we can see, our data frame consists of three variables: longitude, latitude and time.
Whithout much efford, we can plot our GPS data using
ggplot2. Please note that GPS coordinates must be plotted as points.
ggplot(df, aes(x = lon, y = lat)) + coord_quickmap() + geom_point()
In addition, the
ggmap package offers some functionality to plot the data on maps.
The first example shows how to plot the data on a map provided by Google Maps.
mapImageData <- get_googlemap(center = c(lon = mean(df$lon), lat = mean(df$lat)), zoom = 10, color = 'bw', scale = 1, maptype = "terrain") ggmap(mapImageData, extent = "device") + # removes axes, etc. geom_point(aes(x = lon, y = lat), data = df, colour = "red3", alpha = .1, size = .1)
The second example shows how to plot the data on a Stamen map.
mapImage <- get_map(location = c(lon = mean(df$lon) - 0.05, lat = mean(df$lat)), source = "stamen", maptype = "toner", zoom = 10) ggmap(mapImage, extent = "device") + geom_point(aes(x = lon, y = lat), data = df, colour = "red3", size = .2)
This blog post heavily borrows from the tutorial Mapping GPS Tracks in R. Thanks very much!