使用ggmap创建地图和持续错误R

Using ggmap to create maps and persistent error R

我有一段代码突然停止工作了。就如此容易。我在 SO 上找到了一些模糊的答案,但对我的情况没有任何帮助。

library(ggmap)
myLocation <- c(21.5, -18.5, 34, -8)

myMap <- get_map(location=myLocation,
                 source="google", maptype="terrain", crop=FALSE, color="bw")

我收到以下错误:

Warning: bounding box given to google - spatial extent only approximate.
converting bounding box to center/zoom specification. (experimental)
Error in download.file(url, destfile = tmp, quiet = !messaging, mode = "wb") : 
  cannot open URL 'http://maps.googleapis.com/maps/api/staticmap?center=-13.25,27.75&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false'
In addition: Warning message:
In download.file(url, destfile = tmp, quiet = !messaging, mode = "wb") :
  cannot open URL 'http://maps.googleapis.com/maps/api/staticmap?center=-13.25,27.75&zoom=6&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false': HTTP status was '403 Forbidden'

试过这一行,但没有帮助:

options(download.file.method = "curl")

如果我尝试 osm - 还有问题:

osmmap <- get_openstreetmap(bbox = c(left = 21.5, bottom = -18.5, right =
                                   34, top = 8), scale = 7, color = c("bw"))
Error: map grabbing failed - see details in ?get_openstreetmap.
In addition: There were 16 warnings (use warnings() to see them)

知道该怎么做吗?

我在使用 get_map 下载地图时遇到了类似的问题(403 Forbidden 和 OVER QUERY LIMIT)- 我通过使用 dput 保存地图解决了这个问题在计算机上和 dget 加载地图。

map <- get_map(location = myLocation, source="google", maptype="terrain", crop=FALSE, color="bw")
dput(map, file = "myMaps")
map <- dget(file = "myMaps")

现在如果您有多个地图要下载并且错误率很高,您可以使用带有 tryCatch 的循环来执行下载。

myLocation <- c(21.5, -18.5, 34, -8)

getMap <- function(loc){
  map <- get_map(location = loc, source="google", maptype="terrain", crop=FALSE, color="bw")
  i <<- 0
  return(map)
}

i <- -1
c <- 0 # avoid infinite loop

while(i < 0 & c < 20){
  tryCatch(map <- getMap(myLocation), error = function(w){
    i <- -1
  })
  c <- c+1
}

所以这里有两件事导致了问题。

  1. ggmap 使用 Google 地图作为其标准地图源。 ggmap 正在连接的 Google 地图 API 需要一个已注册的静态地图 API 密钥。您可以获得(免费)API 密钥 here,但请注意,您必须注册帐单才能使用(如果您不这样做,地图 API 请求将 return 一个错误)。完成设置后,您需要通过 register_google(key = "...")
  2. 在每个新会话中注册它

  1. ggmap 正在连接的 Google 地图 API 需要 lon/lat 坐标(例如,location = c(-75.1636077,39.9524175))以完全 运行.

因此,您的完整代码为:

library(rjson)
library(digest)
library(glue)
library(devtools)
if(!requireNamespace("devtools")) install.packages("devtools")
devtools::install_github("dkahle/ggmap", ref = "tidyup")
library(ggmap)

register_google(key = "...",  # your Static Maps API key
                account_type = "standard")

map <- get_map(location = c(-75.1636077,39.9524175), zoom = 13)

ggmap(map)