代码之家  ›  专栏  ›  技术社区  ›  geo_dd

通过R中的光栅循环保存/存储

  •  0
  • geo_dd  · 技术社区  · 7 年前

    我有一个大的光栅堆栈,每两层计算最大值。除了 getZ

    谢谢

    示例代码

    m_date<-as.data.frame(as.Date(c('2009-05-01','2010-03-25','2007-06-14','2008-12-18','2016-05-20')))
    
    m_r <- raster(matrix(1:60,3,4))
    m_stack <- stack(m_r,m_r,m_r,m_r,m_r)
    m_stack <- addLayer(m_stack,m_date)
    
    new_stack<-m_stack[[1]]
    new_stackk@z$Date<-m_stack@z$Date[[1]]
    
    
    for (i in 1:5) {
        # calculate max every two layers (works fine)
        new_stack[[k]] <- calc(m_stack[[((i-1)*2 + 1):((i-1)*2 + 2)]], fun = max, na.rm = T)
        # store the date for each one of the max layers (does not work)
        new_stack@z$Date[[i]] <-m_stack@z$Date[[i]]
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   jsta    7 年前

    下面是一些运行的代码。它假设:

    1. 您希望比较相邻日期(图层按日期排序)
    library(raster)
    
    m_date <- data.frame(date = 
      as.Date(c('2009-05-01','2010-03-25','2007-06-14','2008-12-18')))
    
    m_r       <- lapply(m_date$date, function(x) raster(matrix(rnorm(60),3,4)))
    m_stack   <- stack(m_r)
    m_stack@z <- list(m_date = m_date[,1])
    
    # sort by date
    m_stack   <- m_stack[[order(m_stack@z$m_date)]]
    
    new_stack <- m_stack[[-1]]
    
    for (i in 1:(nlayers(new_stack))) {
      new_stack[[i]] <- calc(m_stack[[i:(i+1)]], fun = max)
    
      new_stack@z$m_date[[i]] <- m_stack@z$m_date[i:(i+1)][
        which.max(c(
          cellStats(m_stack[[i]], stat = max), 
          cellStats(m_stack[[i+1]], stat = max)))]
    }
    
    new stack
    
    dimensions  : 3, 4, 12, 3  (nrow, ncol, ncell, nlayers)
    resolution  : 0.25, 0.3333333  (x, y)
    extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
    coord. ref. : NA 
    names       :     layer.1,     layer.2,     layer.3 
    min values  : -0.03990727, -0.46295595, -0.39121706 
    max values  :    2.261900,    2.261900,    1.647811 
    m_date      : 2008-12-18, 2008-12-18, 2009-05-01