使用 R 的 netcdf 栅格堆栈或栅格块的时间和地理子集
time and geographical subset of netcdf raster stack or raster brick using R
对于以下包含 2016 年每日全球海面温度的 netcdf 文件,我正在尝试 (i) 按时间划分子集,(ii) 按地理划分子集,(iii) 然后对每个像素采用长期方法并创建一个基本情节。
Link 到文件:here
library(raster)
library(ncdf4)
设置我的工作目录后打开netcdf
nc_data <- nc_open('sst.day.mean.2016.v2.nc')
更改时间变量以便于解释
time <- ncdf4::ncvar_get(nc_data, varid="time")
head(time)
更改为我可以解释的日期
time_d <- as.Date(time, format="%j", origin=as.Date("1800-01-01"))
现在我想仅对 9 月 1 日至 10 月 15 日进行子集化,但无法弄清楚...
在时间子集之后,创建栅格块(或堆栈)和地理子集
b <- brick('sst.day.mean.2016.v2.nc') # I would change this name to my file with time subest
地理子集
b <- crop(b, extent(144, 146, 14, 16))
最后,我想取所有数据中每个像素的平均值,将其分配给单个栅格,并绘制一个简单的图...
感谢您的帮助和指导。
在b <- brick('sst.day.mean.2016.v2.nc')
之后,我们可以输入b
来查看光栅砖的信息。
b
# class : RasterBrick
# dimensions : 720, 1440, 1036800, 366 (nrow, ncol, ncell, nlayers)
# resolution : 0.25, 0.25 (x, y)
# extent : 0, 360, -90, 90 (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
# data source : C:\Users\basaw\Downloads\sst.day.mean.2016.v2.nc
# names : X2016.01.01, X2016.01.02, X2016.01.03, X2016.01.04, X2016.01.05, X2016.01.06, X2016.01.07, X2016.01.08, X2016.01.09, X2016.01.10, X2016.01.11, X2016.01.12, X2016.01.13, X2016.01.14, X2016.01.15, ...
# Date : 2016-01-01, 2016-12-31 (min, max)
# varname : sst
请注意,Date
槽具有从 2016-01-01
到 2016-12-31
的信息,这意味着 Z 值已经具有日期信息,我们可以使用它来对光栅块进行子集化。
我们可以使用getZ
函数来访问存储在Z值中的值。输入getZ(b)
我们可以看到一系列的日期。
head(getZ(b))
# [1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05" "2016-01-06"
class(getZ(b))
# [1] "Date"
因此,我们可以使用以下代码对栅格块进行子集化。
b2 <- b[[which(getZ(b) >= as.Date("2016-09-01") & getZ(b) <= as.Date("2016-10-15"))]]
然后我们可以根据您提供的代码裁剪图像。
b3 <- crop(b2, extent(144, 146, 14, 16))
要计算平均值,只需使用 mean
函数。
b4 <- mean(b3, na.rm = TRUE)
最后,我们可以绘制平均值。
plot(b4)
不是在 R 中,而是要指出子集和平均任务在 CDO 中从命令行很容易完成:
cdo timmean -sellonlatbox,lon1,lon2,lat1,lat2 -seldate,date1,date2 in.nc out.nc
其中 lon1、lon2 等定义要剪切的经纬度区域,date1、date2 是日期范围。
然后您可以将生成的文件读入 R 进行绘图,或者使用 ncview 快速查看。
对于以下包含 2016 年每日全球海面温度的 netcdf 文件,我正在尝试 (i) 按时间划分子集,(ii) 按地理划分子集,(iii) 然后对每个像素采用长期方法并创建一个基本情节。
Link 到文件:here
library(raster)
library(ncdf4)
设置我的工作目录后打开netcdf
nc_data <- nc_open('sst.day.mean.2016.v2.nc')
更改时间变量以便于解释
time <- ncdf4::ncvar_get(nc_data, varid="time")
head(time)
更改为我可以解释的日期
time_d <- as.Date(time, format="%j", origin=as.Date("1800-01-01"))
现在我想仅对 9 月 1 日至 10 月 15 日进行子集化,但无法弄清楚...
在时间子集之后,创建栅格块(或堆栈)和地理子集
b <- brick('sst.day.mean.2016.v2.nc') # I would change this name to my file with time subest
地理子集
b <- crop(b, extent(144, 146, 14, 16))
最后,我想取所有数据中每个像素的平均值,将其分配给单个栅格,并绘制一个简单的图...
感谢您的帮助和指导。
在b <- brick('sst.day.mean.2016.v2.nc')
之后,我们可以输入b
来查看光栅砖的信息。
b
# class : RasterBrick
# dimensions : 720, 1440, 1036800, 366 (nrow, ncol, ncell, nlayers)
# resolution : 0.25, 0.25 (x, y)
# extent : 0, 360, -90, 90 (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
# data source : C:\Users\basaw\Downloads\sst.day.mean.2016.v2.nc
# names : X2016.01.01, X2016.01.02, X2016.01.03, X2016.01.04, X2016.01.05, X2016.01.06, X2016.01.07, X2016.01.08, X2016.01.09, X2016.01.10, X2016.01.11, X2016.01.12, X2016.01.13, X2016.01.14, X2016.01.15, ...
# Date : 2016-01-01, 2016-12-31 (min, max)
# varname : sst
请注意,Date
槽具有从 2016-01-01
到 2016-12-31
的信息,这意味着 Z 值已经具有日期信息,我们可以使用它来对光栅块进行子集化。
我们可以使用getZ
函数来访问存储在Z值中的值。输入getZ(b)
我们可以看到一系列的日期。
head(getZ(b))
# [1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05" "2016-01-06"
class(getZ(b))
# [1] "Date"
因此,我们可以使用以下代码对栅格块进行子集化。
b2 <- b[[which(getZ(b) >= as.Date("2016-09-01") & getZ(b) <= as.Date("2016-10-15"))]]
然后我们可以根据您提供的代码裁剪图像。
b3 <- crop(b2, extent(144, 146, 14, 16))
要计算平均值,只需使用 mean
函数。
b4 <- mean(b3, na.rm = TRUE)
最后,我们可以绘制平均值。
plot(b4)
不是在 R 中,而是要指出子集和平均任务在 CDO 中从命令行很容易完成:
cdo timmean -sellonlatbox,lon1,lon2,lat1,lat2 -seldate,date1,date2 in.nc out.nc
其中 lon1、lon2 等定义要剪切的经纬度区域,date1、date2 是日期范围。
然后您可以将生成的文件读入 R 进行绘图,或者使用 ncview 快速查看。