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
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")
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:
cbind
. Assurez-vous simplement de connaître la longitude de votre coupe.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:
Edit: J'ai un peu joué avec votre carte Google, mais les latitudes ne sont pas correctes. :-(
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(.)
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.
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.