问题
我从 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
假设您的 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)
检查是否已携带正确的图层。