Plotting points from a data.frame using OpenStreetMap
I don't know the OpenStreetMap
package. But I offer an alternative that still draws an OpenStreet Map, but uses the ggmap
package to fetch and draw the map. The get_map
function can fetch maps from a variety of sources: osm, google, stamen, and cloudmade; set with source
. In addition the sources have different styles, set with maptype
. The boundary of the map is given in a location vector. Alternatively, the location vector can give the centre of the map with an appropriate zoom level set. The map is drawn with ggplot2
, and so points and labels can be added to the map as if they were being added to any ggplot object. To run the following, the ggmap
and ggplot2
packages need to be installed.
library(ggmap)
stores <- data.frame(name=c("Commercial","Union","Bedford"),
longitude=c(-70.25042295455933,-70.26050806045532,-70.27726650238037),
latitude=c(43.657471302616806,43.65663299041943,43.66091757424481))
location = c(-70.2954, 43.64278, -70.2350, 43.68093)
# Fetch the map
portland = get_map(location = location, source = "osm")
# Draw the map
portlandMap = ggmap(portland)
# Add the points layer
portlandMap = portlandMap + geom_point(data = stores, aes(x = longitude, y = latitude), size = 5)
# Add the labels
portlandMap + geom_text(data = stores, aes(label = name, x = longitude+.001, y = latitude), hjust = 0)
The result is:
The labels could be getting lost in the background. In that case, something like this might be appropriate. It uses code from here to give the text an outline.
portlandMap = ggmap(portland) + geom_point(data = stores, aes(x = longitude, y = latitude), size = 5)
theta <- seq(pi/16, 2*pi, length.out=32)
xo <- diff(location[c(1,3)])/250
yo <- diff(location[c(2,4)])/250
for(i in theta) {
portlandMap <- portlandMap + geom_text(data = stores,
aes_(x = stores$longitude + .001 + cos(i) * xo,
y = stores$latitude + sin(i) * yo,
label = stores$name),
size = 5, colour = 'black', hjust = 0)
}
portlandMap +
geom_text(data = stores, aes(x = longitude + .001, y = latitude, label=name),
size = 5, colour = 'white', hjust = 0)