web-dev-qa-db-fra.com

Carte du monde avec ggmap

J'utilise ggmap et souhaite avoir une carte du monde centrée sur l'Australie sur laquelle je peux facilement tracer des points géocodés. ggmap semble être beaucoup plus facile à utiliser par rapport à certains autres packages de cartographie. Pourtant, lorsque j'apporte une carte en utilisant le code ci-dessous, il se trompe 

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

Dans l'aide de get_map: "Zoom: zoom de la carte, nombre entier compris entre 0 (monde entier) et 21 (bâtiment), valeur par défaut 10 (ville). Openstreetmaps limite le zoom de 18, et La limite sur les cartes d'étamine dépend du type de carte. 'auto' détermine automatiquement le zoom pour les spécifications du cadre de sélection et est réglé par défaut à 10 avec les spécifications de centre/zoom. "

Changer le zoom en un n'erreur pas pour get_map mais 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 ne soit pas tirée. Enfin, avec un zoom de 2, cela fonctionne mais ne passe pas à travers une carte du monde entier

Ma question est donc la suivante: comment utiliser get_map pour obtenir une carte du monde?

Informations de session:

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 
24
user1414259

EDIT: mis à jour vers ggplot2 v 0.9.3

J'ai essayé quelque chose de similaire récemment mais avec peu de succès. Cependant, il existe plusieurs façons de centrer une carte du monde à partir du package map: voir ici , ici et ici . En utilisant le code de cette dernière, voici un exemple qui centre la carte du monde sur la longitude 160, trace les emplacements des miroirs CRAN (coordonnées obtenues à l'aide de la fonction geocode() du paquet ggmap) sur la carte du monde tracée à l'aide de ggplot2, et colorie la Nouvelle-Zélande (à l'aide de geom_polygon) . En centrant la carte sur la longitude 160, gardez l’ensemble de l’Afrique à gauche de la carte et la majeure partie du Groenland à 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

14
Sandy Muspratt

J'ai récemment eu la même erreur et cela se résumait à ggmap ne pas aimer les latitudes en dehors de $\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.

Voici comment je l'ai résolu:

  • téléchargement séparé d'une image projetée Mercator via BigMap
  • Il fallait faire attention à la latitude: j'ai eu les mêmes erreurs que vous indiquez avec des limites de latitude en dehors de $\pm $ 80 ° lorsque je m'attendais à ce que tout se passe bien jusqu'à la couverture à 85 ° OSM), mais je ne les ai pas retrouvées, car pas besoin des très hautes latitudes. 
  • Le centre 0 °/0 ° était bon pour mon but (je suis en Europe :-)), mais vous pouvez certainement couper l'image où bon vous semble et l'envelopper vous-même de cbind. Assurez-vous simplement de connaître la longitude de votre coupe.
  • puis définissez le cadre de sélection de votre image
  • et assigner 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: J'ai un peu joué avec votre carte Google, mais les latitudes ne sont pas correctes. :-(

9
cbeleites

J'ai réussi à créer une carte du monde basée sur Google Maps. Ceci est malheureusement légèrement déformé, car je pense que ggmap/Google Maps impose des restrictions (longueur des données = 409600 pixels, la dimension étant un multiple de 792). Néanmoins, la combinaison suivante des paramètres de taille, d’échelle et de zoom fournit une carte du monde de Google avec ggmap. 

Naturellement, vous pouvez modifier lon pour modifier le point de focalisation longitudinale en Australie, comme vous le souhaitez.

library(tidyverse)

your_gmaps_API_key <- ""

get_googlemap(center = c(lon = 0, lat = 0)
          , zoom = 1
          , maptype="roadmap"
          , size = c(512,396) 
          , scale = 2
          , color = "bw"
          , key = your_gmaps_API_key) %>% ggmap(.)

 Resulting map

Remarque: les points sur la carte proviennent de mon propre jeu de données et ne sont pas générés par le code ci-dessus, mais la carte du monde revêt une importance capitale ici.

0
user2530062

Vérifiez le coord_map intégré de ggplot. Cela peut créer des cartes sans nécessiter un jeu de tuiles tiers. C'est parfait pour les cartes simples et peut utiliser toute la beauté de ggplot.

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

0
zach