根据空间点数据框中的值有条件地从栅格堆栈数据中提取数据
Conditionally extract data from a raster stack data based on values in a spatial points dataframe
我有一个包含 84 个图层的栅格堆栈,每个图层对应于 1999 年 11 月到 2006 年 10 月的 1 个月降雨量。我将栅格堆栈中的图层命名为 199911 到 200610,即年份后跟月份。我还有一个空间点数据框,其中每一行都有一个相同格式的日期。
我想从栅格堆栈中提取某行日期与该行空间位置上个 10 月之间所有降雨量的总和。因此,如果一行的日期是 20006 年(2000 年 6 月),它将对该行所在位置从 199910(1999 年 10 月)到 20006 年之间的所有降雨量求和。因为我有很多数据,所以我想自动执行此过程。
我试图让它工作,但并不愉快。有人有什么建议吗?
这是一种选择:
library(raster)
# Vector of dates
dates <- format(seq(as.Date('1999/1/11'), as.Date('2006/1/10'), by='month'), '%Y%m')
# RasterStack with random data
s <- setNames(stack(replicate(length(dates), raster(matrix(runif(100), 10)))),
paste0('rain', dates))
# Create a SpatialPointsDataFrame with some random dates and coords
d <- data.frame(x=runif(10), y=runif(10), date=sample(dates, 10))
coordinates(d) <- ~x+y
# Split the spdf by date
d_by_date <- split(d, d$date)
# Extract values
rain_sum <- unsplit(lapply(d_by_date, function(x) {
# current year
y <- as.numeric(substr(x$date, 1, 4))
# current month
m <- as.numeric(substr(x$date, 5, 6))
# if month is after Oct, start from that year's Oct
# if month is before Oct, start from previous year's Oct
if(m < 11) y <- y-1
start_date <- as.Date(sprintf('%s/10/01', y))
# if start_date is earlier than first time slice, reset to first time slice
start_date <- max(min(as.Date(sub('rain', '01', names(s)), '%d%Y%m')), start_date)
end_date <- as.Date(paste0(x$date, '01'), '%Y%m%d')
# Sequence of dates to sum over
i <- format(seq(start_date, end_date, by='month'), 'rain%Y%m')
# Extract values and sum
sum(extract(s[[i]], x))
}), d$date)
我有一个包含 84 个图层的栅格堆栈,每个图层对应于 1999 年 11 月到 2006 年 10 月的 1 个月降雨量。我将栅格堆栈中的图层命名为 199911 到 200610,即年份后跟月份。我还有一个空间点数据框,其中每一行都有一个相同格式的日期。
我想从栅格堆栈中提取某行日期与该行空间位置上个 10 月之间所有降雨量的总和。因此,如果一行的日期是 20006 年(2000 年 6 月),它将对该行所在位置从 199910(1999 年 10 月)到 20006 年之间的所有降雨量求和。因为我有很多数据,所以我想自动执行此过程。
我试图让它工作,但并不愉快。有人有什么建议吗?
这是一种选择:
library(raster)
# Vector of dates
dates <- format(seq(as.Date('1999/1/11'), as.Date('2006/1/10'), by='month'), '%Y%m')
# RasterStack with random data
s <- setNames(stack(replicate(length(dates), raster(matrix(runif(100), 10)))),
paste0('rain', dates))
# Create a SpatialPointsDataFrame with some random dates and coords
d <- data.frame(x=runif(10), y=runif(10), date=sample(dates, 10))
coordinates(d) <- ~x+y
# Split the spdf by date
d_by_date <- split(d, d$date)
# Extract values
rain_sum <- unsplit(lapply(d_by_date, function(x) {
# current year
y <- as.numeric(substr(x$date, 1, 4))
# current month
m <- as.numeric(substr(x$date, 5, 6))
# if month is after Oct, start from that year's Oct
# if month is before Oct, start from previous year's Oct
if(m < 11) y <- y-1
start_date <- as.Date(sprintf('%s/10/01', y))
# if start_date is earlier than first time slice, reset to first time slice
start_date <- max(min(as.Date(sub('rain', '01', names(s)), '%d%Y%m')), start_date)
end_date <- as.Date(paste0(x$date, '01'), '%Y%m%d')
# Sequence of dates to sum over
i <- format(seq(start_date, end_date, by='month'), 'rain%Y%m')
# Extract values and sum
sum(extract(s[[i]], x))
}), d$date)