How to change the scale of maps in ggplot2?

3

I'm making a map with ggplot and ggmap. However, the axis scales are in decimal degrees, but I need them in degrees, minutes, and seconds. Thanks for the help!

    
asked by anonymous 15.08.2017 / 00:51

1 answer

3

I saw your post in the English version and got some breakthrough. There is the dms function of the GEOmap package that transforms decimal into degrees. Here is the code for my attempt.

library(ggplot2)
library(ggmap)
library(GEOmap)

#get my map
city<- get_map(location = c(lon= -54.847, lat= -22.25),
               maptype = "satellite",zoom = 11,color="bw")

map<-ggmap(city,extent="normal")+
  xlab("Longitude")+ ylab("Latitude")

scale_x_longitude <- function(xmin=-180, xmax=180, step=1, ...) {
  xbreaks <- seq(xmin,xmax,step)
  xlabels <- unlist(
    lapply(xbreaks, function(x){
      ifelse(x < 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"),
                               paste0(abs(dms(x)$m),expression(~minute)), "*W")), 
             ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"),
                                             paste0(abs(dms(x)$m),expression(~minute)),"*E")),
                    abs(dms(x))))}))
  return(scale_x_continuous("Longitude", breaks = xbreaks, labels = xlabels, expand = c(0, 0), ...))
}

scale_y_latitude <- function(ymin=-90, ymax=90, step=0.5, ...) {
  ybreaks <- seq(ymin,ymax,step)
  ylabels <- unlist(
    lapply(ybreaks, function(x){
      ifelse(x < 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"),
                                      paste0(abs(dms(x)$m),expression(~minute)), "*S")), 
             ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"),
                                             paste0(abs(dms(x)$m),expression(~minute)),"*N")),
                    abs(dms(x))))}))
  return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...))
} 

map +
  scale_x_longitude(-55.0,-54.7,.1) +
  scale_y_latitude(-22.4,-22.1,.1)

    
15.08.2017 / 21:35