为什么裁剪栅格堆栈会更改图层名称?

时间:2020-02-26 22:45:42

标签: r raster netcdf

我正在使用来自CHIRPS的每日降水数据处理每年的多层netCDF文件。我拥有全世界的文件,每个文件大约1.2gb。我需要根据降水数据为特定区域的栅格中的每个像元计算索引。为此,我尝试使用R光栅包将文件裁剪为感兴趣区域上方的矩形。

这是我正在使用的代码,以第一个文件为例。

library(ncdf4)
library(raster)
library(rgdal)

# Crop extent
crop_extent <- as(raster::extent(79, 89, 25, 31), "SpatialPolygons")
proj4string(crop_extent) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

# Set directory with original files
setwd("~/data")

# Read file
chirps81 <- stack("chirps-v2.0.1981.days_p05.nc")
chirps81crop <-crop(chirps1981, crop_extent)

# Write cropped file back to different folder
setwd("~/croppeddata")
writeRaster(chirps81crop, "chirps81crop.nc", overwrite=TRUE)

但是由于某些原因,在写入文件时,图层会丢失其名称。在原始文件中以及裁剪后的名称中,图层名称的格式为“ X1981.01.01”。但是在使用new file <- stack("chirps81crop.nc")写入和读取netCDF文件之后,层名称将更改为格式“ X1”到“ X365”。我认为使用它应该很好,假设各层的顺序没有混淆,但我不了解各层名称的情况,以及是否发生这种情况,因为代码有问题。 / p>

2 个答案:

答案 0 :(得分:2)

丢失图层名称的是writeRaster()函数,而不是裁剪操作。可以使用较低级别的ncdf函数为每个图层分配一个数字值(不幸的是不是一个字符串),然后在读取后会以图层名称显示。从示例here中汲取灵感,我创建了一些代码来演示这一点。

library(ncdf4)
library(raster)
library(rgdal)

# Crop extent
crop_extent <- as(raster::extent(5.74, 5.75, 50.96, 50.97), "SpatialPolygons")
proj4string(crop_extent) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

# make a sample file
r <- raster(system.file("external/test.grd", package="raster"))
r.latlon <- projectRaster(r, crs = proj4string(crop_extent))
writeRaster(x=r.latlon, filename = 'test.nc', format = 'CDF', overwrite=TRUE)

# read the sample as a 2 layer stack and crop it
test <- stack('test.nc', 'test.nc')
writeRaster(test, 'teststack.nc', overwrite=TRUE, format='CDF')
testcrop <- crop(test, crop_extent)
names(testcrop)
# [1] "test.1" "test.2"

# write the cropped file and make the zname equal to Layer
writeRaster(testcrop, 'testcrop.nc', overwrite=TRUE, format='CDF', zname='Layer')
# open the cdf file directly
nc <- nc_open('testcrop.nc', write = T)
# give the layers numbers starting from 10 so 
# we can see them easily
layers = 1:nlayers(testcrop) + 10
layers
# [1] 11 12
ncvar_put(nc, 'Layer', layers)
nc_close(nc)

newtestcrop <- stack('testcrop.nc')
names(newtestcrop)
# [1] "X11" "X12"
nc <- nc_open('testcrop.nc', write = F)
layers = ncvar_get(nc, 'Layer')
layers
# [1] 11 12
nc_close(nc)

因此在编写栅格时可以使用数字控制名称,但是我对您的环境了解不足,无法确定是否会有所帮助,因为将所需名称映射到单个名称可能很棘手明确的数字。

答案 1 :(得分:1)

我希望您不介意我提供非R解决方案,但是从命令行使用CDO可以轻松完成此任务:

cdo sellonlatbox,79,89,25,31 chirps-v2.0.1981.days_p05.nc cropped_file.nc

您要计算哪个指数?我怀疑也可以通过CDO函数快速轻松地计算出这些值...

相关问题