Ich verwende ggmap und wünsche mir eine Weltkarte mit Schwerpunkt Australien, auf der ich geokodierte Punkte problemlos zeichnen kann. ggmap scheint im Vergleich zu einigen anderen Mapping-Paketen viel einfacher zu verwenden. Wenn ich jedoch eine Karte mit dem Code darunter bringe, sind Fehler aufgetreten.
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
Aus der get_map-Hilfe: "Zoom: Karten-Zoom, eine Ganzzahl von 0 (ganze Welt) bis 21 (Gebäude), Standardwert 10 (Stadt) Die Begrenzung für Staubblatt-Karten hängt vom Kartentyp ab. 'auto' bestimmt automatisch den Zoom für die Begrenzungsrahmenspezifikationen und ist standardmäßig auf 10 mit Mittelpunkt-/Zoomspezifikationen eingestellt. "
Wenn Sie den Zoom auf einen Wert ändern, tritt bei get_map kein Fehler auf, beim Plotten dieser Karte
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
Anscheinend wird der Längengrad nicht durchgezogen. Schließlich funktioniert es mit einem Zoom von 2, führt aber keine Karte der ganzen Welt durch
Meine Frage ist also, wie kann ich mit get_map eine Weltkarte erhalten?
Sitzungsinfo:
sessionInfo () R Version 2.15.0 (2012-03-30) Plattform: i386-pc-mingw32/i386 (32-Bit)
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: Auf ggplot2 v 0.9.3 aktualisiert
Ich habe etwas Ähnliches kürzlich ausprobiert, aber mit wenig Erfolg. Es gibt jedoch mehrere Möglichkeiten, eine Weltkarte aus dem Paket map
zu zentrieren: siehe hier , hier und hier . Anhand des Codes des letzteren wird hier ein Beispiel dargestellt, bei dem die Weltkarte auf Längengrad 160 zentriert wird. CRAN-Spiegelpositionen (mit der Funktion geocode()
aus dem Paket ggmap erhaltene Koordinaten) werden auf der mit ggplot2 geplotteten Weltkarte dargestellt und die Farben Neuseeland (mithilfe von geom_polygon
) . Wenn Sie die Karte auf Längengrad 160 zentrieren, behalten Sie ganz Afrika links von der Karte und den größten Teil von Grönland rechts von der Karte.
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")
Ich habe vor kurzem den gleichen Fehler erhalten und es ging auf ggmap herunter, die Breitengrade außerhalb von $\pm $ 80 ° nicht mochte.
Ich musste mein Bild jedoch separat herunterladen, da es für einen Download zu groß war (mit OSM). Das ist nicht dein Problem, aber ich nehme es für zukünftige Leser auf.
So habe ich es gelöst:
cbind
einwickeln. Stellen Sie einfach sicher, dass Sie den Längengrad Ihres Schnittes kennen.Folgendes mache ich:
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)))
ergebnis:
Edit: Ich habe ein bisschen mit Ihrer Google-Map herumgespielt, aber die Breitengrade wurden nicht richtig angegeben. :-(
Es ist mir gelungen, eine Weltkarte basierend auf Google Maps zu erstellen. Dies ist leider etwas verzerrt, da ich glaube, dass ggmap/Google Maps Einschränkungen auferlegt (Datenlänge = 409600 Pixel, wobei die Dimension ein Vielfaches von 792 ist). Die folgende Kombination von Größen-, Skalierungs- und Zoom-Parametern liefert jedoch eine Google-Weltkarte mit ggmap.
Natürlich können Sie lon
ändern, um den Fokuspunkt der Längsrichtung in Australien nach Ihren Wünschen zu ändern.
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(.)
Hinweis: Punkte auf der Karte stammen aus meinem eigenen Datensatz und werden nicht durch den obigen Code erzeugt, aber die Weltkarte ist hier von zentraler Bedeutung.
Sehen Sie sich die eingebaute coord_map von ggplot an. Dadurch können Karten erstellt werden, ohne dass ein Kachelsatz eines Drittanbieters erforderlich ist. Es ist großartig für einfache Karten und kann all die Schönheit von ggplot nutzen.