使用坐标以及R中shapefile中的另一个值从栅格中提取值

时间:2018-11-02 14:52:35

标签: r if-statement extract raster

我有大约300个气候数据栅格(年平均降水量和温度)。每个栅格代表该年的全球平均值。每个栅格均以相应的年份命名,例如1900等。然后我有了一个带有博物馆标本信息的shapefile。这包括收集它们的坐标和收集年份。我想为每个坐标提取气候变量,但是仅当收集年份与栅格文件的名称相同时才可以。然后,我需要为所有栅格循环此操作。到目前为止,我可以使用extract(1900,axes)提取所有坐标的气候数据。 1900是栅格的名称,坐标是shapefile的名称。

我尝试仅在一个栅格上使用if命令if(coordinates $ CollYear == 1900,{ 提取(1900,坐标) }

但这不起作用。

关于如何根据栅格文件名进行选择,我不知道。

任何提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

请始终提供一些示例数据:

library(raster)
f <- system.file("external/rlogo.grd", package="raster") 
s <- stack(f, f)
names(s) <- 1900:1905
p <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 
               7, 14, 26, 29, 39, 45, 51, 56, 46), ncol=2)
p <- data.frame(p, c(1900:1905, 1904:1902))
colnames(p) <- c("lon", "lat", "year")
p

# lon lat year
#1  48   7 1900
#2  48  14 1901
#3  48  26 1902
#4  53  29 1903
#5  50  39 1904
#6  46  45 1905
#7  54  51 1904
#8  70  56 1903
#9  84  46 1902

方法1.稍后提取所有值和子集:

e <- extract(s, p[,c("lon", "lat")])

cnms <- as.numeric(gsub("X", "", colnames(e)))
j <- match(p$year, cnms)
pairs <- cbind(1:nrow(e), j)

v <- e[ pairs ] 
v
#[1] 194 161 203 221 173 174 202 179 152

方法2。循环多年

vv <- rep(NA, nrow(p))
snms <- as.numeric(gsub("X", "", names(s)))
for (y in unique(p$year)) {
    i <- p$year == y
    py <- p[i, ]
    j <- which(snms == y )
    vv[i] <- extract(s[[j]], py[,c("lon", "lat")])
}
vv
#[1] 194 161 203 221 173 174 202 179 152