首页 > 解决方案 > 在 r 中使用 nc 数据写入栅格

问题描述

我正在使用https://ldas.gsfc.nasa.gov/gldas GLDAS_NOAH10_M:GLDAS 诺亚地表模型(netcdf4 格式)来提取雪水当量和土壤水分。

雪水当量显示 3 个维度(纬度、经度和时间),我可以轻松编写其栅格(tiff 格式),如照片和代码所示。

土壤水分包含 4 个维度(纬度、经度、深度、时间),很难导出。在这种情况下,任何人都可以知道如何以 tiff 格式编写光栅吗?谢谢。

图书馆:

library(raster)
library(sp)
library(rgdal)
library(ncdf4)
library(tiff)

小路 :

ncpath <- "D:\\GLDAS Data\\2002_GLDAS\\"
ncname <- "GLDAS_NOAH10_M.A200201.001.grb.SUB"

情况1

ncfname <- paste(ncpath, ncname, ".nc4", sep="")
ncin <- nc_open(ncfname)

检查:打印(NCIN)

变量:

lon <- ncvar_get(ncin, "lon")
lat <- ncvar_get(ncin, "lat")
b_unit <- ncatt_get(ncin,"SWE","units")
swe.array <- ncvar_get(ncin, "SWE")
dim(swe.array)
fillvalue <- ncatt_get(ncin, "SWE", "_FillValue")
nc_close(ncin)

出口 :

b <- raster(swe.array, xmn=min(lon), xmx=max(lon), ymn=min(lat), ymx=max(lat), crs=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs+ towgs84=0,0,0"))
b <- flip (b, direction = 'y')
writeRaster(b, file = paste0("D:\\GLDAS Data\\2002_GLDAS\\SWE_mm_month_200201",".tif"), overwrite = TRUE)

案例2

ncfname <- paste(ncpath, ncname, ".nc4", sep="")
ncin <- nc_open(ncfname)
print(ncin)
lon <- ncvar_get(ncin, "lon")
lat <- ncvar_get(ncin, "lat")
c_unit <- ncatt_get(ncin,"SoilMoist","units")
sm.array <- ncvar_get(ncin, "SoilMoist")
dim(sm.array)
fillvalue <- ncatt_get(ncin, "SoilMoist", "_FillValue")
nc_close(ncin)

出口 :

c <- raster(sm.array, xmn=min(lon), xmx=max(lon), ymn=min(lat), ymx=max(lat), 
            crs=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs+ towgs84=0,0,0"))
c <- flip (c, direction = 'y')
writeRaster(c, file = paste0("D:\\GLDAS Data\\2002_GLDAS\\SM_mm_month_200201",".tif"),overwrite = TRUE)

代码照片

标签: rrstudiogisnoaa

解决方案


您可以使用 raster() 将 nc 文件作为光栅对象直接读取。要在土壤湿度的 4D 数据中提取某个级别的数据,您可以通过使用 level 参数指定单个级别来提取单个级别。

c <- raster(ncfname, level = 1)
writeRaster(c, file = paste0("D:\\GLDAS Data\\2002_GLDAS\\SM_mm_month_200201",".tif"),overwrite = TRUE)

推荐阅读