获得几个国家的最低行政管理水平

时间:2019-02-04 16:49:51

标签: r

我正在尝试获得多个国家/地区的最低管理界限。 到目前为止,我可以毫无问题地在国​​家/地区级别下载数据。

world <- c("IOT", "BEN", "TGO")
ac <- list()
for ( i in 1:lenght(world)){
ac[[i]] <- getData("GADM", country=world[i], level=0)
}
world_boundaries <- do.call("bind",ac)

问题没有一个国家/地区具有相同的管理边界级别,因此每次我尝试将级别更改为较低级别时,都会收到一个错误消息:无法打开URL。我当时正在考虑创建一个循环,尝试每个管理级别,但我无法弄清楚。

ac <- list()
levl <- C("0", "1", "2", "3", "4", "5")
for ( i in 1:lenght(world)){
ac[[i]] <- getData("GADM", country=world[i], level=levl)
}
world_boundaries <- do.call("bind",ac)

所以我有点卡住了,我不知道如何解决这个问题。 谢谢

1 个答案:

答案 0 :(得分:0)

以下是使用tryCatch的建议方法。我认为可以稍微整理一下该解决方案,但这是一个起点。基本上,对于每个国家/地区,开始尝试以最高管理员级别下载边界。如果有警告或错误,请跳到下一个级别。如果成功,则tryCatch将结束,标志仍设置为TRUE,然后下一个国家/地区开始。

library(raster)

world <- c("ITO", "BEN", "TGO")
ac <- list()
levl <- c(0:5)

for ( i in 1:length(world)){
  j <- length(levl)
  while (j >= 0) {
  FLAG <- TRUE
  ac[[i]] <- tryCatch(getData("GADM", country=world[i], level=levl[j]), 
                      warning = function(w) {j <<- j-1
                      FLAG <<- FALSE},
                      error = function(e) {j <<- j-1
                      FLAG <<- FALSE})
  if (!FLAG) next
  if (FLAG) break
  }
}

world_boundaries <- do.call("bind",ac)