2012-06-26 24 views
23

Estoy usando ggmap y deseo tener un mapa del mundo centrado en Australia al que pueda trazar fácilmente puntos geocodificados. ggmap parece ser mucho más fácil de usar en comparación con algunos de los otros paquetes de mapeo. Sin embargo, cuando traigo un mapa usando el código a continuación, cometo errores.Mapa mundial con ggmap

gc <- geocode('australia') 
center <- as.numeric(gc) 
> map <- get_map(location = center, source="google", maptype="terrain", zoom=0) 
Error: zoom must be a whole number between 1 and 21 

De la ayuda get_map: "zoom. Mapa de zoom, un número entero de 0 (el mundo entero) a 21 (edificio), el valor por defecto 10 (de la ciudad) OpenStreetMaps limita un zoom de 18 años, y el límite en los mapas de estambre depende del tipo de mapa. "auto" determina automáticamente el zoom para las especificaciones de la caja delimitadora, y se predetermina a 10 con las especificaciones de centro/zoom ".

cambiar el zoom a uno no lo hace error para get_map pero lo hace para trazar ese mapa

map <- get_map(location = center, source="google", maptype="terrain", zoom=1) 
ggmap(map) 

Warning messages: 
1: In min(x) : no non-missing arguments to min; returning Inf 
2: In max(x) : no non-missing arguments to max; returning -Inf 
3: In min(x) : no non-missing arguments to min; returning Inf 
4: In max(x) : no non-missing arguments to max; returning -Inf 

Parece que la longitud no está siendo tirado a través. Finalmente, con un zoom de 2 funciona, pero no trae un mapa del mundo entero

Entonces, mi pregunta es ¿cómo puedo usar get_map para obtener un mapa mundial?

Sesión Info:

sessionInfo() R versión 2.15.0 (2012-03-30) Plataforma: i386-pc-mingw32/i386 (32 bits)

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] mapproj_1.1-8.3 maps_2.2-6  rgdal_0.7-12 sp_0.9-99  
[5] ggmap_2.1  ggplot2_0.9.1 

loaded via a namespace (and not attached): 
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  grid_2.15.0  
[5] labeling_0.1  lattice_0.20-6  MASS_7.3-17  memoise_0.1  
[9] munsell_0.3  plyr_1.7.1   png_0.1-4   proto_0.3-9.2  
[13] RColorBrewer_1.0-5 reshape2_1.2.1  RgoogleMaps_1.2.0 rjson_0.2.8  
[17] scales_0.2.1  stringr_0.6  tools_2.15.0 
+0

Aún no ha aceptado una respuesta, ¿ha encontrado una solución diferente? – maj

+0

@maj No he encontrado ninguna solución para usar el mapa mundial. Las respuestas a continuación son geniales, pero es necesario extraer un mapa del mundo de otro lugar y luego trazarlo. – user1414259

Respuesta

13

EDITAR: actualizado para ggplot2 v 0.9.3

intenté algo similar pero con recenty poco éxito. Sin embargo, hay una serie de formas de centrar un mapa mundial desde el paquete map: vea here, here y here. Usando el código de este último, aquí hay un ejemplo que centra el mapa mundial en la longitud 160, traza las ubicaciones de los espejos CRAN (coordenadas obtenidas usando la función geocode() del paquete ggmap) en el mapa mundial trazado usando ggplot2, y colores Nueva Zelanda (usando geom_polygon) . Al centrar el mapa en la longitud 160, se debe mantener toda África a la izquierda del mapa y la mayor parte de Groenlandia a la derecha del mapa.

library(maps) 
library(plyr) 
library(ggplot2) 
library(sp) 
library(ggmap) 

# Get some points to plot - CRAN Mirrors 
Mirrors = getCRANmirrors(all = FALSE, local.only = FALSE) 

Mirrors$Place = paste(Mirrors$City, ", ", Mirrors$Country, sep = "") # Be patient 
tmp = geocode(Mirrors$Place) 
Mirrors = cbind(Mirrors, tmp) 

################################################################################################### 
# Recentre worldmap (and Mirrors coordinates) on longitude 160 
### Code by Claudia Engel March 19, 2012, www.stanford.edu/~cengel/blog 

### Recenter #### 
center <- 160 # positive values only 

# shift coordinates to recenter CRAN Mirrors 
Mirrors$long.recenter <- ifelse(Mirrors$lon < center - 180 , Mirrors$lon + 360, Mirrors$lon) 

# shift coordinates to recenter worldmap 
worldmap <- map_data ("world") 
worldmap$long.recenter <- ifelse(worldmap$long < center - 180 , worldmap$long + 360, worldmap$long) 

### Function to regroup split lines and polygons 
# Takes dataframe, column with long and unique group variable, returns df with added column named group.regroup 
RegroupElements <- function(df, longcol, idcol){ 
    g <- rep(1, length(df[,longcol])) 
    if (diff(range(df[,longcol])) > 300) { # check if longitude within group differs more than 300 deg, ie if element was split 
    d <- df[,longcol] > mean(range(df[,longcol])) # we use the mean to help us separate the extreme values 
    g[!d] <- 1 # some marker for parts that stay in place (we cheat here a little, as we do not take into account concave polygons) 
    g[d] <- 2 # parts that are moved 
    } 
    g <- paste(df[, idcol], g, sep=".") # attach to id to create unique group variable for the dataset 
    df$group.regroup <- g 
    df 
} 

### Function to close regrouped polygons 
# Takes dataframe, checks if 1st and last longitude value are the same, if not, inserts first as last and reassigns order variable 
ClosePolygons <- function(df, longcol, ordercol){ 
    if (df[1,longcol] != df[nrow(df),longcol]) { 
    tmp <- df[1,] 
    df <- rbind(df,tmp) 
    } 
    o <- c(1: nrow(df)) # rassign the order variable 
    df[,ordercol] <- o 
    df 
} 

# now regroup 
worldmap.rg <- ddply(worldmap, .(group), RegroupElements, "long.recenter", "group") 

# close polys 
worldmap.cp <- ddply(worldmap.rg, .(group.regroup), ClosePolygons, "long.recenter", "order") # use the new grouping var 
############################################################################# 

# Plot worldmap using data from worldmap.cp 
windows(9.2, 4) 
worldmap = ggplot(aes(x = long.recenter, y = lat), data = worldmap.cp) + 
    geom_polygon(aes(group = group.regroup), fill="#f9f9f9", colour = "grey65") + 
    scale_y_continuous(limits = c(-60, 85)) + 
    coord_equal() + theme_bw() + 
    theme(legend.position = "none", 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    #axis.text.x = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks = element_blank(), 
    panel.border = element_rect(colour = "black")) 

# Plot the CRAN Mirrors 
worldmap = worldmap + geom_point(data = Mirrors, aes(long.recenter, lat), 
    colour = "red", pch = 19, size = 3, alpha = .4) 

# Colour New Zealand 
# Take care of variable names in worldmap.cp 
head(worldmap.cp) 
worldmap + geom_polygon(data = subset(worldmap.cp, region == "New Zealand", select = c(long.recenter, lat, group.regroup)), 
      aes(x = long.recenter, y = lat, group = group.regroup), fill = "blue") 

enter image description here

+0

Gracias por eso. Estaba al tanto de las otras formas que has mencionado, pero esperaba que hubiera una forma de usar ggmap porque luego puedo trazar puntos ¡fácilmente! – user1414259

9

Hace poco recibí el mismo error y se reducía a ggmap no le gustaba latitudes fuera de $ \ pm $ 80 °.

Sin embargo, tuve que descargar mi imagen por separado, ya que era demasiado grande para descargarla (con OSM); este no es tu problema, pero lo grabo para futuros lectores.

Así es como lo resolví:

    imagen
  • descarga independiente de un Mercator proyecta a través de BigMap
  • La latitud es necesario algún tipo de atención: Tengo los mismos errores que demuestren con los límites de latitud fuera $ \ pm $ 80 ° cuando esperaba que todo estuviera bien hasta que cubra los 85 ° OSM), pero no los seguí, ya que de todos modos no necesito las latitudes muy altas.
  • 0 °/0 ° centro fue bueno para mi propósito (estoy en Europa :-)), pero ciertamente puede cortar la imagen donde sea que sea bueno para usted y envolverlo usted mismo por cbind. Solo asegúrate de saber la longitud de tu corte.
  • continuación, establezca el cuadro delimitador de la imagen
  • y asignar las clases apropiadas

Aquí es lo que hago:

require ("ggmap") 
library ("png") 

zoom <- 2 
map <- readPNG (sprintf ("mapquest-world-%i.png", zoom)) 
map <- as.raster(apply(map, 2, rgb)) 

# cut map to what I really need 
pxymin <- LonLat2XY (-180,73,zoom+8)$Y # zoom + 8 gives pixels in the big map 
pxymax <- LonLat2XY (180,-60,zoom+8)$Y # this may or may not work with google 
             # zoom values 
map <- map [pxymin : pxymax,] 

# set bounding box 
attr(map, "bb") <- data.frame (ll.lat = XY2LonLat (0, pxymax + 1, zoom+8)$lat, 
            ll.lon = -180, 
            ur.lat = round (XY2LonLat (0, pxymin, zoom+8)$lat), 
            ur.lon = 180) 
class(map) <- c("ggmap", "raster") 

ggmap (map) + 
    geom_point (data = data.frame (lat = runif (10, min = -60 , max = 73), 
           lon = runif (10, min = -180, max = 180))) 

resultado:
ggplot world map

Editar: Jugué un poco alrededor con su mapa de google, pero no obtuve las latitudes correctas. :-(

0

Salida coord_map incorporado de ggplot. Esto puede crear mapas sin necesidad de un tercer juego del partido de los azulejos. Su grande para mapas sencillos y se puede utilizar toda la belleza que es ggplot.

http://docs.ggplot2.org/current/coord_map.html

+0

Como se menciona en el enlace, coord_map (orientation = c (lon, lat, rotation)) se supone que resuelve este problema de recentrado, pero no es así. La orientación predeterminada es c (90,0,180), y cambiarla a c (90,160,180) puede cambiar el centro, pero también daña la visualización del mapa. No parece haber ninguna solución tampoco. Lo que @sandy publicó es la única solución (que puedo encontrar) en ggplot2. – woshishui