如何在 R 中按季节分割栅格堆栈

问题描述 投票:0回答:1

问题

我从 NASA 海洋颜色项目下载了 2012 年至 2024 年海面温度的多个 Lm3 4 km netcdf 文件(n = 4640)。

我已将所有文件放入光栅堆栈中:

class       : SpatRaster 
dimensions  : 766, 709, 1  (nrow, ncol, nlyr)
resolution  : 0.04165021, 0.04165796  (x, y)
extent      : 24.61, 54.14, 5.8, 37.71  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 
source      : AQUA_MODIS.20120101.L3m.DAY.SST.x_sst.nc:sst 
varname     : sst (Sea Surface Temperature) 
name        :      sst 
unit        : degree_C 
> sst_stack
class      : RasterStack 
dimensions : 766, 709, 543094, 4640  (nrow, ncol, ncell, nlayers)
resolution : 0.04165021, 0.04165796  (x, y)
extent     : 24.61, 54.14, 5.8, 37.71  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      : Sea.Surface.Temperature.1, Sea.Surface.Temperature.2, Sea.Surface.Temperature.3, Sea.Surface.Temperature.4, Sea.Surface.Temperature.5, Sea.Surface.Temperature.6, Sea.Surface.Temperature.7, Sea.Surface.Temperature.8, Sea.Surface.Temperature.9, Sea.Surface.Temperature.10, Sea.Surface.Temperature.11, Sea.Surface.Temperature.12, Sea.Surface.Temperature.13, Sea.Surface.Temperature.14, Sea.Surface.Temperature.15, ... 
   

在实地工作期间,我们每年每月收集珊瑚礁中海豚数量的数据。我的数据框从 2012 年到 2024 年,冬季为 7 个月,夏季为 5 个月。

我想将栅格堆栈分成两个季节(夏季和冬季):

  • 夏季是从五月到九月
  • 冬季是从十月到四月

我已经阅读了很多资料来了解如何做到这一点,并且这个解决方案看起来是最接近的。我不知道如何执行此操作,因为我是新手

抱歉,由于所有权问题,我无法共享数据

非常感谢,如果有人能指出我正确的方向。

R 代码

#Download Sea Surface Temperature 
folder_SST<"~/Documents/GIS_Data/SST."
files_SST <-list.files(folder_SST, pattern='*.nc', full.names ="TRUE")

for (file in files_SST) {
  nc_SST=open.nc(files_SST)
  print.nc(nc_SST)
}

#Stack the AQUA-MODIS files with raster stack
sst_stack<-raster::stack(files_SST)

这就是我的数据框的样子

Survey_Number       Dates Longitude_E_DD Latitude_N_DD    SST
              1   2012-08-01       33.89083      27.26778 23.635
              2   2012-06-02       33.86782      27.40854 23.640
              3   2012-02-07       33.86230      27.44623 23.690
              4   2012-02-12       33.88653      27.26957 23.635
              5   2012-02-13       33.88766      27.26848 23.635
              6   2012-02-14       33.85000      27.36111 23.780
              7   2012-02-15       33.86177      27.41302 23.640
r gis raster netcdf temporal
1个回答
0
投票

假设您的 SpatRaster 图层名称:

海面.温度.1
海面.温度.2
...

对应:

AQUA_MODIS.20120101.L3m.DAY.SST.x_sst.nc
AQUA_MODIS.20120101.L3m.DAY.SST.x_sst.nc
...

您可以首先重命名图层,以便“直观”地命名,然后使用

grep()
和正则表达式来拆分堆栈。

首先,包含两年数据的 SpatRaster 堆栈示例:

library(terra)

r_list <- paste0("sst.", 1:731)

set.seed(42)

rr <- lapply(r_list, function(x) {
  
  r <- rast(nrows = 100, ncols = 100, ext(-180, 180, -90, 90))
  values(r) <- round(runif(10000, 5, 30),2)
  names(r) <- as.character(x)
  return(r)
  
})

sst_stack <- rast(rr)

sst_stack
# class       : SpatRaster 
# dimensions  : 100, 100, 731  (nrow, ncol, nlyr)
# resolution  : 3.6, 1.8  (x, y)
# extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
# source(s)   : memory
# names       : sst.1, sst.2, sst.3, sst.4, sst.5, sst.6, ... 
# min values  :  5.01,     5,     5,  5.01,     5,     5, ... 
# max values  : 30.00,    30,    30, 29.99,    30,    30, ... 

现在创建一个由新图层名称组成的向量,其日期长度与

nlyr(sst_stack)
相同,并重命名 SpatRaster 图层。新的名称向量需要位于最小日期和最大日期之间(在您的实际数据中,我假设这是 2012-01-01 到 2024-09-13,您需要根据您的命名方式仔细检查这是否正确你的图层)。

# Create vector of equal length to nlyr(sst_stack) for renaming SpatRaster layers with dates
r_list1 <- paste0("sst.", seq(as.Date("2012-01-01"), as.Date("2013-12-31"), by = "day"))

# Rename SpatRaster layes
names(sst_stack) <- r_list1

sst_stack
# class       : SpatRaster 
# dimensions  : 100, 100, 731  (nrow, ncol, nlyr)
# resolution  : 3.6, 1.8  (x, y)
# extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
# source(s)   : memory
# names       : sst.2~01-01, sst.2~01-02, sst.2~01-03, sst.2~01-04, sst.2~01-05, sst.2~01-06, ... 
# min values  :        5.01,           5,           5,        5.01,           5,           5, ... 
# max values  :       30.00,          30,          30,       29.99,          30,          30, ... 

# Note the names are truncated in the print(), but they are like:
head(names(sst_stack))
"sst.2012-01-01" "sst.2012-01-02" "sst.2012-01-03" "sst.2012-01-04" "sst.2012-01-05" "sst.2012-01-06"

现在使用两个正则表达式根据月份字符串匹配创建两个单独的 SpatRaster 堆栈:

# Create two separate SpatRasters using regex to match month values in layers
sst_summer <- sst_stack[[grep("-0[5-9]-", r_list1, value = TRUE)]]
sst_winter <- sst_stack[[grep("-(0[1-4]|1[0-2])-", r_list1, value = TRUE)]]

sst_summer
# class       : SpatRaster 
# dimensions  : 100, 100, 306  (nrow, ncol, nlyr)
# resolution  : 3.6, 1.8  (x, y)
# extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
# source(s)   : memory
# names       : sst.2~05-01, sst.2~05-02, sst.2~05-03, sst.2~05-04, sst.2~05-05, sst.2~05-06, ... 
# min values  :           5,        5.01,           5,           5,        5.00,           5, ... 
# max values  :          30,       30.00,          30,          30,       29.99,          30, ... 

sst_winter
# class       : SpatRaster 
# dimensions  : 100, 100, 425  (nrow, ncol, nlyr)
# resolution  : 3.6, 1.8  (x, y)
# extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
# source(s)   : memory
# names       : sst.2~01-01, sst.2~01-02, sst.2~01-03, sst.2~01-04, sst.2~01-05, sst.2~01-06, ... 
# min values  :        5.01,           5,           5,        5.01,           5,           5, ... 
# max values  :       30.00,          30,          30,       29.99,          30,          30, ...

重命名每个图层的一个优点是,您可以使用

names(sst_summer)
names(sst_winter)
检查是否已携带正确的图层。

© www.soinside.com 2019 - 2024. All rights reserved.