首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据空间点数据中的值有条件地从光栅堆栈数据中提取数据

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

Stack Overflow用户
提问于 2016-04-19 15:12:40
回答 1查看 1.4K关注 0票数 1

我有一个栅格堆叠,包含84层,每层对应于1999年11月至2006年10月的1个月降雨量。我已经命名了在我的栅格堆栈199911到200610的层次,也就是年份,然后是月份。我也有一个空间点数据,其中每一行都有一个相同格式的日期。

我想从栅格堆叠中提取一行日期到前一个十月在那一行的空间位置的所有雨量之和。因此,如果一排的日期是20006 (2000年6月),它将在199910 (1999年10月)至20006年间将该行所在位置的所有降雨量加在一起。因为我有很多数据,所以我想要自动化这个过程。

我试着让这件事起作用,但没有joy。有人有小费吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 00:08:21

这里有一个选择:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36722492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档