Carte du monde avec ggmap
j'utilise ggmap et je 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 que certains autres paquets de cartographie. Pourtant, quand je fais passer une carte en utilisant le code ci-dessous, il y a des erreurs.
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 carte, un entier de 0 (monde entier) à 21 (bâtiment), valeur par défaut 10 (Ville). openstreetmaps limite un zoom de 18, et à la limite sur les étamines des cartes dépend du type de la correspondance. "auto" détermine automatiquement le zoom pour les spécifications de la boîte de délimitation, et est défiguré à 10 avec les spécifications du centre/zoom."
changer le zoom à un ne 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
on dirait que la longitude n'est pas tirée à travers. Enfin avec un zoom de 2 il ne fonctionne pas mais ne porte pas à travers une carte du monde entier
alors, ma question Est Comment puis-je utiliser get_map pour obtenir une carte du monde?
informations de la Session:
sessionInfo() Version R 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
3 réponses
MODIFIER : mise à Jour de ggplot2 v 0.9.3
j'ai essayé quelque chose de similaire récemment, mais avec peu de succès. Cependant, il y a plusieurs façons de centrer une carte du monde à partir du paquet map
: voir ici , ici , et ici . En utilisant le code de ce dernier, voici un exemple qui Centre la carte du monde sur la longitude 160, trace les emplacements miroir CRAN (coordonnées obtenu en utilisant la fonction geocode()
du paquet ggmap) sur la carte du monde tracée en utilisant ggplot2, et colours New Zealand (En utilisant geom_polygon
). Centrage de la carte sur la longitude 160 garder toute L'Afrique sur la gauche de la carte, et la plupart 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")
j'ai récemment obtenu la même erreur et il a bouilli vers le bas à ggmap n'aime pas 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 par Mercator via BigMap
- la latitude avait besoin de soins: j'ai eu les mêmes erreurs que vous montrez avec les limites de latitude en dehors de$ \pm $ 80° quand je m'attendais à ce que tout devrait être bien jusqu'à la couverture de 85° OSM), mais je ne les ai pas tracés vers le bas car 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 où il est bon pour vous et envelopper vous-même par
cbind
. Assurez-vous de savoir la longitude de votre couper. - puis définissez la zone limite de votre image
- et attribuer 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:
Edit: j'ai joué un peu avec votre Google map, mais je n'ai pas eu les bonnes latitudes. :- (
Vérifiez l'image intégrée de ggplot. Cela peut créer des cartes sans exiger d'un tiers jeu de tuiles. Son idéal pour les cartes simples et peut utiliser toute la beauté qui est ggplot.