如何使用坐标和 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
使用 R shapefile 包中的 convert.to.shapefile 将额外的数据列添加到 shapefile