2011-02-26 37 views
10

也許由於我是R相對較新的事實,我在使用http://www.gadm.org/上的gadm-Mapfiles時遇到問題。GADM-Maps跨國比較圖形

我嘗試繪製幾個國家的地圖,並將它們相互比較(使用不同的顏色)。

這是我做的

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. (這個問題可能是由我newbieness引起)是否有裝載形狀文件更方便的方法?我發現它總是重新命名gadm-Object,這很愚蠢。也許甚至有一種方式,R只下載一次數據,然後將它們存儲在工作區/本地某處?
  2. 我該如何說服R在一張地圖上繪製所有這些國家?

提前致謝!

[編輯]

一些不錯的功能 隨着加文·辛普森的幫助下,我能創造一些不錯的功能,降低了整個地圖合併到一條線路:

## 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

+0

也許這將是更好地使用maptools而不是SP結合?你能幫我怎麼做嗎? – speendo 2011-02-26 12:21:21

+1

1)的原因是在R中,一個對象有一個名字,並且在save()'d時被保存在對象定義的旁邊。該名稱是該對象保存表示形式的一個組成部分,我不認爲你可以用'load()'做任何事情。然而,這種行爲很容易通過你自己的包裝來繞過'load()'。 – 2011-02-26 14:28:05

回答

7

對於問題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()這三個對象放在一起,而不是連接它們。然而,這並沒有對這些對象和多邊形ID的工作不是唯一的:

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

我工作的這一點,如果我周圍找出工作將更新。 解決方案是使用spChFIDs()更改Polygons 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... 
+0

太棒了!謝謝!涉及maptools的解決方案會更容易嗎? – speendo 2011-02-26 16:43:34

+1

取決於你的意思;如果你想使用maptools來閱讀shapefile,我認爲它不會有任何幫助。 shapefiles將讀取ID爲0,1,...所以您將有相同的非唯一ID問題。事實上,我認爲GADM R文件是通過讀取形狀文件而產生的,這些文件首先提供了非唯一的ID。 maptools會將sp對象用於讀入R的shape文件,因此我不認爲通過使用它可以獲得任何結果--GADM人員已爲您完成此導入步驟。 – 2011-02-27 11:43:57

+0

謝謝! 你可以編輯你的答案,並將rownames()命令更改爲row.names()?我認爲這將有助於那些將來閱讀這些內容的人,因爲使用row.names()它也可以處理1級和2級文件(不知道爲什麼,會很有趣......)。 – speendo 2011-02-28 19:37:59

2

有一些小的改進,我可以提供。首先,如果要繪製根據某些條件繪製國家/地區的地圖圖形,則必須將該值加載到相應的GADM文件中,例如,來自另一個數據幀。這是我如何做的:

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

這個最簡單的解決方案是

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)