如何使用坐标和 R 中 shapefile 中的另一个值从栅格中提取值?

Posted

技术标签:

【中文标题】如何使用坐标和 R 中 shapefile 中的另一个值从栅格中提取值?【英文标题】:How can I extract values from raster using coordinates plus another value in a shapefile in R? 【发布时间】:2018-11-02 14:52:35 【问题描述】:

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

我尝试在一个栅格上使用 if 命令

if(coordinates$CollYear==1900, 
extract(1900, coordinates)

但这不起作用。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何使用坐标和 R 中 shapefile 中的另一个值从栅格中提取值?的主要内容,如果未能解决你的问题,请参考以下文章

R:在 shapefile 中的多边形上绘制 .gdb 文件中的点

读取/导入 .tpk 地图到 R 或 QGIS 并用作 shapefile

在 Geopandas 中转换 shapefile 的坐标

使用 R shapefile 包中的 convert.to.shapefile 将额外的数据列添加到 shapefile

在 R 中组合多个 shapefile

在R中取消嵌套纬度/经度坐标的嵌套列表?