Plotting with ggmap
Recently, I came across ggmap package for R. It supposedly makes for some very easy plotting on top of Google Maps or OpenStreetMap. I grabbed a GPS recording I had laying around, and gave it a try.
You may recall my previous attempts at plotting GPS data. This time, the data file I was using was recorded with a USB GPS dongle. The data is much nicer than what a cheap smartphone GPS could produce.
> head(pts)
time ept lat lon alt epx epy mode
1 1357826674 0.005 42.22712 -83.75227 297.7 9.436 12.755 3
2 1357826675 0.005 42.22712 -83.75227 297.9 9.436 12.755 3
3 1357826676 0.005 42.22712 -83.75227 298.1 9.436 12.755 3
4 1357826677 0.005 42.22712 -83.75227 298.4 9.436 12.755 3
5 1357826678 0.005 42.22712 -83.75227 298.6 9.436 12.755 3
6 1357826679 0.005 42.22712 -83.75227 298.8 9.436 12.755 3
For this test, I used only the latitude, longitude, and altitude columns. Since the altitude is in meters, I multiplied it by 3.2 to get a rough altitude in feet. Since the data file is long and goes all over, I truncated it to only the last 33 minutes.
The magical function is the get_map function. You feed it a location, a zoom level, and the type of map and it returns the image. Once you have the map data, you can use it with the ggmap function to make a plot. ggmap behaves a lot like ggplot2’s ggplot function and so I felt right at home.
Since the data I am trying to plot is a sequence of latitude and longitude observations, I’m going to use the geom_path function to plot them. Using geom_line would not produce a path since it reorders the data points. Second, I’m plotting the altitude as the color.
Here are the resulting images:
If you are wondering why the line doesn’t follow any roads… Roads? Where we’re going, we don’t need roads. (Hint: flying)
Here’s the entire script to get the plots:
#!/usr/bin/env Rscript
library(ggmap)
pts <- read.csv("gps.csv")
/* get the bounding box... left, bottom, right, top */
loc <- c(min(pts$lon), min(pts$lat), max(pts$lon), max(pts$lat))
for (type in c("roadmap","hybrid","terrain")) {
print(type)
map <- get_map(location=loc, zoom=13, maptype=type)
p <- ggmap(map) + geom_path(aes(x=lon, y=lat, color=alt*3.2), data=pts)
jpeg(paste(type, "-preview.jpg", sep=""), width=600, height=600)
print(p)
dev.off()
jpeg(paste(type, ".jpg", sep=""), width=1024, height=1024)
print(p)
dev.off()
}
P.S. If you are going to use any of the maps for anything, you better read the terms of service.



Comment by Nick — February 19, 2014 @ 21:15
Comment by Carol — July 14, 2014 @ 15:27
Comment by JeffPC — July 15, 2014 @ 14:42
Comment by JeffPC — July 15, 2014 @ 14:44