2012-06-26 13 views
23

J'utilise ggmap et souhaite avoir une carte du monde centrée sur l'Australie à laquelle je peux facilement tracer des points géocodés. ggmap semble être beaucoup plus facile à utiliser par rapport à d'autres paquets de cartographie. Pourtant, lorsque j'apporte une carte en utilisant le code ci-dessous, il y a des erreurs.Carte du monde avec 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 l'aide get_map: « zoom:. Zoom de la carte, un nombre entier de 0 (monde entier) à 21 (bâtiment), la valeur par défaut 10 (ville) limite OpenStreetMap un zoom de 18 ans et la limite sur les cartes staminales dépend du type de carte. 'auto' détermine automatiquement le zoom pour les spécifications de la boîte englobante et est réglé par défaut à 10 avec les spécifications de centre/zoom. "

Modification du zoom on fait pas d'erreur pour get_map mais fait pour tracer cette carte

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 

Il semble que la longitude est pas tiré à travers. Enfin avec un zoom de 2 ça fonctionne mais ça n'apporte pas une carte du monde entier

Alors, ma question est comment puis-je utiliser get_map pour obtenir une carte du monde?

Session info:

sessionInfo() R version 2.15.0 (2012-03-30) Plate-forme: 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

vous n'avez pas accepté une réponse encore, si vous avez trouvé une autre solution? – maj

+0

@maj J'ai trouvé aucune solution à l'aide ggmap à tirer par-dessous les réponses du monde sont grands, mais ils ont besoin en tirant une carte du monde d'ailleurs et puis tracer dessus. – user1414259

Répondre

13

EDIT: mise à jour ggplot2 v 0.9.3

J'ai essayé quelque chose de similaire, mais avec recenty peu de succès. Cependant, il existe un certain nombre de façons de centrer une carte du monde à partir du package map: voir here, here et here. Voici un exemple qui centre la carte du monde sur la longitude 160, trace les emplacements des miroirs CRAN (coordonnées obtenues en utilisant la fonction geocode() du paquet ggmap) sur la carte du monde tracée en utilisant ggplot2, et les couleurs Nouvelle-Zélande (en utilisant geom_polygon) . Centrer la carte sur la longitude 160 garde toute l'Afrique sur la gauche de la carte, et la plus grande partie du Groenland sur la droite de la carte.

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

Merci pour cela. Je connaissais les autres moyens dont vous avez parlé, mais j'espérais qu'il y avait un moyen utilisant ggmap parce que je peux ensuite tracer des points facilement! – user1414259

9

J'ai récemment obtenu la même erreur et il se résumaient aux latitudes ggmap ne pas aimer l'extérieur $ \ pm $ 80 °.

Cependant, j'ai dû télécharger mon image séparément car elle était trop grande pour un téléchargement (avec OSM); ce n'est pas votre problème, mais je l'enregistre pour les futurs lecteurs.

Voilà comment je l'ai résolu:

  • téléchargement séparé de Mercator image projetée par BigMap
  • La latitude nécessaire des soins: Je suis les mêmes erreurs vous montrent les limites de latitude à l'extérieur $ \ pm 80 $ ° quand je m'attendais à ce que tout se passe bien jusqu'à ce que les couvertures de 85 ° OSM), mais je ne les ai pas traqués puisque je n'ai de toute façon pas besoin des latitudes très élevées.
  • 0 °/0 ° centre était bon pour mon but (je suis en Europe :-)), mais vous pouvez certainement couper l'image, il est bon whereever pour vous et envelopper par vous-même cbind. Assurez-vous de connaître la longitude de votre coupe.
  • puis définissez la zone de délimitation de l'image
  • et assignez les classes appropriées

Voici ce que je fais:

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))) 

Résultat:
ggplot world map

Edit: Je jouais un peu avec votre carte google, mais je n'ai pas eu les latitudes correctes. :-(

0

Découvrez de coord_map intégré de ggplot. Cela peut créer des cartes sans nécessiter un poste tiers des tuiles. Son grand pour les cartes simples et peut utiliser toute la beauté qui est ggplot.

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

+0

Comme mentionné dans le lien, coord_map (orientation = c (lon, lat, rotation)) est supposé résoudre ce problème de recentrage, mais ce n'est pas le cas. La valeur par défaut de l'orientation est c (90,0,180), et la changer en c (90,160,180) peut décaler le centre, mais aussi vider l'affichage de la carte. Il ne semble pas y avoir de solution non plus. Ce que @sandy a posté est la seule solution (que je peux trouver) dans ggplot2. – woshishui

Questions connexes