web-dev-qa-db-de.com

Weltkarte mit ggmap

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

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

enter image description here

14
Sandy Muspratt

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:

  • separater Download eines projizierten Mercator-Bildes über BigMap
  • Der Spielraum erforderte einige Sorgfalt: Ich habe die gleichen Fehler erhalten, die Sie mit Breitengrenzen außerhalb von $\pm $ 80 ° aufwiesen, als ich erwartete, dass alles gut werden sollte, bis die 85-Grad-OSM-Titel deckt Ich brauche nicht die sehr hohen Breiten. 
  • 0 °/0 ° Mitte war gut für meinen Zweck (ich bin in Europa :-)), aber Sie können das Bild sicher überall dort schneiden, wo es Ihnen gut tut, und es selbst mit cbind einwickeln. Stellen Sie einfach sicher, dass Sie den Längengrad Ihres Schnittes kennen.
  • stellen Sie dann den Begrenzungsrahmen Ihres Bildes ein
  • und ordnen Sie die entsprechenden Klassen zu

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:
ggplot world map

Edit: Ich habe ein bisschen mit Ihrer Google-Map herumgespielt, aber die Breitengrade wurden nicht richtig angegeben. :-(

9
cbeleites

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

 Resulting map

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.

0
user2530062

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.

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

0
zach