GADM-Maps跨国比较图形

时间:2011-02-26 11:59:10

标签: r graphics maps

也许是因为我对R比较新,我在http://www.gadm.org/上使用gadm-Mapfiles时遇到了问题。

我尝试绘制一个包含多个国家/地区的地图并将它们相互比较(使用不同的颜色)。

这就是我的工作

library('sp')
##
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/ARG_adm0.RData')) 
# loads an Object "gadm" with shape of Argentinia
arg <- gadm # is there a more convenient way to do this in one line?
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/CHL_adm0.RData'))
# loads an Object "gadm" with shape of Chile
chl <-gadm
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/BOL_adm0.RData'))
# loads an Object "gadm" with shape of Bolivia
bol <- gadm
##
spplot(c(arg, chl, bol))
# output: unable to find an inherited method for function "spplot", for signature "list"

以下是我的问题:

  1. (这个问题可能是由我的新手引起的)是否有更方便的方法来加载shapefile?我觉得一直重命名gadm-Object是非常愚蠢的。也许有一种方法,R只下载一次数据,然后将它们存储在工作区/本地某处?
  2. 我如何说服R在一张地图上绘制所有这些国家?
  3. 提前谢谢!

    [编辑]

    一些不错的功能 在Gavin Simpson的帮助下,我能够创建一些很好的函数,将整个地图合并减少到一行:

    ## you will need the sp-package
    library('sp')
    
    ## load a file from GADM (you just have to specify the countries "special part" of the file name, like "ARG" for Argentina. Optionally you can specify which level you want to have
    loadGADM <- function (fileName, level = 0, ...) {
        load(url(paste("http://biogeo.ucdavis.edu/data/gadm2/R/", fileName, "_adm", level, ".RData", sep     = "")))
        gadm
    }
    
    ## the maps objects get a prefix (like "ARG_" for Argentina)
    changeGADMPrefix <- function (GADM, prefix) {
        GADM <- spChFIDs(GADM, paste(prefix, row.names(GADM), sep = "_"))
        GADM
    }
    
    ## load file and change prefix
    loadChangePrefix <- function (fileName, level = 0, ...) {
        theFile <- loadGADM(fileName, level)
        theFile <- changeGADMPrefix(theFile, fileName)
        theFile
    }
    
    ## this function creates a SpatialPolygonsDataFrame that contains all maps you specify in "fileNames".
    ## E.g.: 
    ## spdf <- getCountries(c("ARG","BOL","CHL"))
    ## plot(spdf) # should draw a map with Brasil, Argentina and Chile on it.
    getCountries <- function (fileNames, level = 0, ...) {
        polygon <- sapply(fileNames, loadChangePrefix, level)
        polyMap <- do.call("rbind", polygon)
        polyMap
    }
    

    找到此页面后,请务必阅读以下答案: https://stackoverflow.com/a/33264548/263589

3 个答案:

答案 0 :(得分:7)

最简单的解决方案是

library(raster)
bol <- getData('GADM', country='BOL', level=1)

plot(bol)

R数据已添加到GADM网站以支持此功能。另请注意,文件格式已更改,以使此页面上描述的其他功能不再有效。

组合不同的国家/地区

per <- getData('GADM', country='PER', level=1)
bp <- bind(bol, per)
plot(bp)

答案 1 :(得分:6)

对于问题1,这是R,因此您可以滚动自己的load()函数来执行您想要的操作,例如:

loadGADM <- function(file, ...) {
    load(file, ...)
    gadm
}

并将其用作:

> ls()
character(0)
> loadGADM <- function(file, ...) {
+     load(file, ...)
+     gadm
+ }
> arg <- loadGADM(url('http://gadm.org/data/rda/ARG_adm0.RData'))
> ls()
[1] "arg"      "loadGADM"

当您知道加载的对象将被调用gadm时,这是一个本地解决方案 - 您可以将功能改进为不需要它,例如:

loadGADM <- function(file, ...) {
    f <- load(file, ...)
    get(f)
}

,因为load()返回已加载对象名称的字符串。

对于问题2,您需要rbind()三个sp个对象,而不是连接它们。但是,这不适用于这些对象,并且多边形ID不是唯一的:

> sa <- rbind(arg, chl, bol)
Error in validObject(res) : 
  invalid class "SpatialPolygons" object: non-unique Polygons ID slot values

我正在研究这个问题,如果我找到解决方法,我会更新。解决方法是使用spChFIDs()更改多边形ID槽值。在这里,我们将"arg_"等附加到对象的rownames,使这些不是唯一的:

arg <- spChFIDs(arg, paste("arg", row.names(arg), sep = "_"))
chl <- spChFIDs(chl, paste("chl", row.names(chl), sep = "_"))
bol <- spChFIDs(bol, paste("bol", row.names(bol), sep = "_"))
sa <- rbind(arg, chl, bol)

然后我们可以绘制合并的sp对象:

plot(sa) ## beware might take a long time to plot...

答案 2 :(得分:2)

我可以提供一些小的改进。

首先,如果要绘制根据某些条件对国家进行着色的地图图形,则必须在相应的GADM文件中加载该值,例如:来自另一个data.frame。我是这样做的:

## load a file from GADM (you just have to specify the countries "special part" of the file name, like "ARG" for Argentina. Optionally you can specify which level you want to have

loadGADM <- function (fileName, level = 0, ...) {
    load(paste("K:/Rdata/gadm/", fileName, "_adm", level, ".RData", sep = ""))
    gadm$coef <- land$coef[land[["abr"]]==fileName]
    gadm
}

如果您绘制较大区域的地图,您的地图将会出现失真。使用rgdal包(及其依赖项)应用地图投影:

newproj <- CRS("+proj=wintri ellps=WGS84 +lon_0=15E")
spdf.wintri <- spTransform(spdf, newproj)

为了绘制属性coef,包sp提供了一个很好的方法:

karte <- spplot(spdf.wintri,"coef",
        xlim=c(-13,46),ylim=c(33,72),
        col.regions = rainbow(100, start = 2/6, end = 4/6),
        main="Country Dummies")