R语言学习记录:nc格式转tif
孤独的王大老实
编辑于 2022年04月04日 19:38
收录于文集
共42篇

R语言转换nc至tif的方法探究

法1:

代码块
R
自动换行
复制代码
library(raster)
library(ncdf4)
library(lattice)
##读取单变量长时间序列nc数据
ncfile<-nc_open("F:/test/pre_2020.nc")
names(ncfile$var)
input_nc = 'F:/test/pre_2020.nc'
varname = 'pre'
raster1 = stack(input_nc, varname = varname)
#设置输出路径名
outpath<-"F:/test/out"
##为文件名设置做准备
x1<-c(1:12)
x2<-paste("2020_",x1,sep = "")
out_filename<-sapply(x2, function(x)paste(x,".tif",sep = ""))  #输出tif格式
out_path<-sapply(out_filename, function(x){
  paste(outpath,x,sep = "/")})      #输出路径名
#批量输出
for(i in 1:12){
  writeRaster(raster1[[i]],out_path[i], format = 'GTiff', overwrite = T)
}
复制成功

法1结果

Reference:https://www.jianshu.com/p/50fac745eb76

总结:代码有点长,路径设置比较麻烦。但是当某个nc文件是连续几年的数据时候比较好用。

另外还学到了一种设置批量路径的新思路,就是提前把各个路径以及文件名设置好,在写出文件路径的时候直接用这个集合【i】的格式。

法2:

代码块
R
自动换行
复制代码
library(raster)
library(ncdf4)
ncfile<-nc_open("F:/test/pre_2020.nc")
names(ncfile$var) #查看varname
prebr <- brick("F:/test/pre_2020.nc")
raster::writeRaster(prebr, filename = paste0("F:/test/out1/2020_",prebr@data@names),
                    bylayer=T, format="GTiff",varname = 'pre')
复制成功

法2结果

Reference:

NetCDF(nc)数据读取与格式转换 (qq.com)

网页链接​

总结:其实原文只有三行代码,长这样:

代码块
R
自动换行
复制代码
library(raster)
tmpbr <- brick("cru_ts4.04.2001.2010.tmp.dat.nc", varname="tmp")
writeRaster(tmpbr, filename = tmpbr@data@names, bylayer=T, format="GTiff")
复制成功

但是有一个问题,第二行里varname参数是需要指定的,如果不指定它会默认进行猜测。我这里的示例nc只有一个变量就是pre,如果有多个变量的话最好还是提前查看指定一下。这个时候就需要用到法1里提到过的ncdf4包。

法3:

代码块
R
自动换行
复制代码
library(terra)
prebr <- rast("F:/test/out/pre_2020.nc")
terra::writeRaster(prebr,paste0("F:/test/out2/2020_",names(prebr),'.tif'),
                   overwrite = T,filetype = "GTiff")
复制成功

法3结果

Reference:王老实(我自己)

总结:在查到法2的时候我自己忍不住又想探究一下terra包会不会有什么区别,促使我探究的原因大概率是前几天在StackExchange上被疯狂安利terra包,法2的作者徐老师也曾经对比过raster包和terra包的运行速度,也推荐使用terra包,但是在徐老师的后面几篇文章中提到:terra包目前有几处地方还不太稳定,有的地方会报错。具体哪来着我也忘了(好像是裁剪还是掩膜啥来着对不齐)。

然后就开始试了一下terra包的writeRaster,果然还是有些不同的:

1.Terra写出必须要加上一个“filetype”的参数,不然会报错。

2.Terra输出的堆栈信息较多

raster包写出的names就是X1...X12,while terra包的names是pre_1...pre_12

上面是rast读取,下面是brick读取

虽然自己肯定都知道自己下载的是什么数据,但是展示出来的信息更多看起来就更舒服一点

3.还有就是两个包输出的时候最好都设置overwrite=T,不然可能会报错。

4.这里还可以手动更改name,让它变成xx_01、xx_02、xx_03的格式。

代码块
R
自动换行
复制代码
number=c(paste0(0,1:9),10:12)
names(t2020) <- paste0('tmp_',number)
复制成功

然后输出的时候可以直接按照name输出

5.需要注意的是法2用raster包写出的时候没加“.tif”,但是最后输出的文件自动带了tif后缀。terra包写出的时候就必须加“.tif”后缀。

cut-off

另外,在StackExchange上有人比较了raster和terra加载nc文件,那个提问者说他用terra加载一个很大的nc用了40多分钟 while raster包只用了一两秒,然后这个问题的回答说raster读取nc文件基于ncdf4,terra读取nc文件基于GDAL,所以很慢,答主当时建议读取nc文件还是用raster包。这是2021年10月12日的提问和回答,不知道现在解决了没有。

https://gis.stackexchange.com/questions/413105/terrarast-vs-rasterbrick-for-loading-in-nc-files