有条件地根据空间点数据帧中的值从栅格堆栈数据中提取数据

时间:2016-04-19 15:12:40

标签: r spatial raster r-raster

我有一个包含84个图层的光栅堆栈,每个图层对应于1999年11月到2006年10月的1个月降雨量。我已经在199911到200610的光栅堆栈中命名了这些图层,即一年又一个月。我还有一个空间点数据框,其中每一行都有相同格式的日期。

我想从光栅堆栈中提取该行的空间位置上一行日期和前一个十月之间所有降雨量的总和。因此,如果一行的日期是20006(2000年6月),它将汇总1999年(1999年10月)和2000年之间该行位置的所有降雨量。由于我有大量数据,我想自动化这一过程。

我试图让这个工作但没有快乐。有人有任何提示吗?

1 个答案:

答案 0 :(得分:1)

这是一个选项:

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)