Created
August 22, 2017 09:12
-
-
Save lbusett/9c45879078c3a03cbb5d18b5427cd60b to your computer and use it in GitHub Desktop.
ggplot_scalebar
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From: | |
https://stackoverflow.com/questions/34416892/how-to-add-a-scale-bar-in-ggplot-map | |
library(maps) | |
library(maptools) | |
library(ggplot2) | |
library(grid) | |
# | |
# Result # | |
#--------# | |
# Return a list whose elements are : | |
# - rectangle : a data.frame containing the coordinates to draw the first rectangle ; | |
# - rectangle2 : a data.frame containing the coordinates to draw the second rectangle ; | |
# - legend : a data.frame containing the coordinates of the legend texts, and the texts as well. | |
# | |
# Arguments : # | |
#-------------# | |
# lon, lat : longitude and latitude of the bottom left point of the first rectangle to draw ; | |
# distanceLon : length of each rectangle ; | |
# distanceLat : width of each rectangle ; | |
# distanceLegend : distance between rectangles and legend texts ; | |
# dist.units : units of distance "km" (kilometers) (default), "nm" (nautical miles), "mi" (statute miles). | |
createScaleBar <- function(lon,lat,distanceLon,distanceLat,distanceLegend, dist.units = "km"){ | |
# First rectangle | |
bottomRight <- gcDestination(lon = lon, lat = lat, bearing = 90, dist = distanceLon, dist.units = dist.units, model = "WGS84") | |
topLeft <- gcDestination(lon = lon, lat = lat, bearing = 0, dist = distanceLat, dist.units = dist.units, model = "WGS84") | |
rectangle <- cbind(lon=c(lon, lon, bottomRight[1,"long"], bottomRight[1,"long"], lon), | |
lat = c(lat, topLeft[1,"lat"], topLeft[1,"lat"],lat, lat)) | |
rectangle <- data.frame(rectangle, stringsAsFactors = FALSE) | |
# Second rectangle t right of the first rectangle | |
bottomRight2 <- gcDestination(lon = lon, lat = lat, bearing = 90, dist = distanceLon*2, dist.units = dist.units, model = "WGS84") | |
rectangle2 <- cbind(lon = c(bottomRight[1,"long"], bottomRight[1,"long"], bottomRight2[1,"long"], bottomRight2[1,"long"], bottomRight[1,"long"]), | |
lat=c(lat, topLeft[1,"lat"], topLeft[1,"lat"], lat, lat)) | |
rectangle2 <- data.frame(rectangle2, stringsAsFactors = FALSE) | |
# Now let's deal with the text | |
onTop <- gcDestination(lon = lon, lat = lat, bearing = 0, dist = distanceLegend, dist.units = dist.units, model = "WGS84") | |
onTop2 <- onTop3 <- onTop | |
onTop2[1,"long"] <- bottomRight[1,"long"] | |
onTop3[1,"long"] <- bottomRight2[1,"long"] | |
legend <- rbind(onTop, onTop2, onTop3) | |
legend <- data.frame(cbind(legend, text = c(0, distanceLon, distanceLon*2)), stringsAsFactors = FALSE, row.names = NULL) | |
return(list(rectangle = rectangle, rectangle2 = rectangle2, legend = legend)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment