MATLAB 批量读取NC文件并转为TIF文件

因为课题处理30年的降雨和蒸发的遥感资料(.NC格式),而想要在Arcgis中处理要求的是raster格式的,所以需要批量转化为tif文件,所以在此分享自己改编之后的代码,可以简洁明了的实现这个过程:

我所参考和借鉴的文章的链接如下:
《 MATLAB读取.nc文件》
《matlab批量处理nc文件》
《Matlab读取气象驱动数据.nc格式的数据》
感谢他们的分享

版本:MATLAB_2018b

clc;
clear;

%% 批读取NC文件的准备工作
datadir = 'G:\Global_P_ET\MSWEP_V2.2\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']);       %列出所有满足指定类型的文件
% a = filelist(1).name;                 %查看要读取的文件的编号
% b = filelist(2).name;
k=length(filelist);

for i = 1:k  %依次读取并处理
    
    %% 批量读取NC文件
    ncFilePath = ['G:\Global_P_ET\MSWEP_V2.2\',filelist(i).name]; %设定NC路径
    num = filelist(i).name(1:6); %读取数据编号,以便于保存时以此编号储存tif
      
    %% 读取变量值
    lon=ncread(ncFilePath,'lon');          %读取经度信息(范围、精度)
    lat=ncread(ncFilePath,'lat');          %读取维度信息
    time=ncread(ncFilePath,'time');        %读取时间序列
    pre=ncread(ncFilePath,'precipitation');%获取降雨变量数据
    sum_pre=sum(pre,3);                    %此处我是为了求月总降水,所以他人可以不管
   
    %% 展示数据内部结构等信息
    % pcolor(lat,lon,sum_pre);
    % shading flat;                        %移除网格线,否则图上一片黑什么都没有
    % [x,y]=meshgrid(lon,lat);             %根据经纬度信息产生格网,3600列(经度),1800列(纬度)
    % phandle=pcolor(x,y,sum_pre');        %显示一个矩阵,其中x,y,sum_pre的行列数必须一致
    % shading flat;
    % colorbar
    % imwrite(sum_pre','...................................','tif')
    
    %% 存为tif格式
    data=flipud(sum_pre');                 %很重要,这是镜像反转,否则最后的图像的南北朝向是错的
    R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
    geotiffwrite(['G:\Global_P_ET\P\',num,'.tif'],data,R);
    disp([num,'done'])
    
end
disp('finish!')

如果仔细看了上述代码,应该会发现在最后一块中用了flipud函数,这一步镜像反转的作用还可通过下例而知(以下是处理AVHRR蒸发数据):

clc;
clear;
datadir = 'G:\Global_P_ET\ET\AVHRR_Zhang\';%specify the location of folder of batch data
filelist = dir([datadir,'*.nc']);      %specify the type of batch data
k = length(filelist);

for i = 1:k
    ncFilePath = ['G:\Global_P_ET\ET\AVHRR_Zhang\',filelist(i).name];
    num = filelist(i).name(19:22);      %record the serial number
    lon = ncread(ncFilePath,'LON')';    %read value of longitude
    lat = ncread(ncFilePath,'LAT')';    %read value of latitude
    
    evapotranspiration = ncread(ncFilePath,'monthly_ET'); %read variable's value of precipitation
    
    for mon=1:12
        data = flipud(permute(evapotranspiration(mon,:,:),[3 2 1]));   %since we did dimensionality reduction, the flipud function here is important to do vertical reversal 
        R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]); 
        if mon<10                          %文件命名,yyyymmdd格式,所以要加0
            geotiffwrite(['G:\Global_P_ET\ET_1\', num ,'0',num2str(mon) ,'.tif'],data,R);
            disp([num,'0',num2str(mon),'done'])
        else
            geotiffwrite(['G:\Global_P_ET\ET_1\', num ,num2str(mon) ,'.tif'],data,R);
            disp([num,num2str(mon),'done']) 
        end        
    end
end
disp('finish!')

二者代码的区别及要点如下:

1.在读入文件时可以预先用NASA提供的Panoply读一下NC文件看看各个变量的名字、大小写以及维度,比如第二个代码中变成了二维的’LON’、‘LAT’和’monthly_ET’。如果没有Panoply也可以用以下代码:

% 显示结构
ncdisp(ncFilePath);%显示nc文件的所有结构,以便大概了解里面的内容
ncdisp(ncFilePath,'evap');%显示指定变量的内容,注意一定要是变量variables才可以
ncdisp(ncFilePath,'/','min');%简单显示结构以及定义
ncdisp(ncFilePath,'/','full');%全部显示所有结构和定义信息


% 读取变量值
ncid = netcdf.open(ncFilePath,'NOWRITE'); %打开nc文件返回索引ID
[ndims,nvars,ngglobalatts,unlimdimid] = netcdf.inq(ncid);%获取维数,变量数,全局属性数量,
[varname,xtype,dimids,natts] = netcdf.inqVar(ncid,0); %根据变量索引号获取变量的名称
--------------------- 
作者:忠言睿长 
来源:CSDN 
原文:https://blog.csdn.net/liyanzhong/article/details/51884735 

2.注意数据的维度以及在降维时的旋转问题,这也是为什么要用flipud函数进行矩阵上下翻转的原因,蒸发数据还好,如果是错的看图一下就能分辨出来,降雨数据就要小心再小心!!!

3.在输出命名时,进行判定加 ‘0’ ,这样就能使最后的图像按着yyyymmdd的顺序排下来,包括之后的读取栅格平均值都很有必要!

希望能帮到你!

在这里插入图片描述

  • 76
    点赞
  • 417
    收藏
    觉得还不错? 一键收藏
  • 96
    评论
要用Matlab批量读取nc文件并转换为tif,可以按照以下步骤进行操作: 首先,需要确保Matlab已经安装了NetCDF工具箱,这样才能读取nc文件。如果没有安装,可以通过在Matlab中运行`ver`命令来检查是否安装了NetCDF工具箱。如果没有安装,可以通过Matlab的插件管理器安装该工具箱。 接下来,可以创建一个文件夹用于存储转换后的tif文件。例如,可以创建一个名为"tif_files"的文件夹。 然后,可以使用Matlab的dir函数获取指定文件夹中所有的nc文件。可以使用绝对路径或相对路径指定文件夹的位置,例如: ``` nc_files = dir('path_to_nc_files/*.nc'); ``` 接下来,使用一个循环来遍历所有的nc文件,并将它们转换为tif。可以使用Matlabncinfo函数读取nc文件的信息,例如: ``` for i = 1:length(nc_files) nc_file = nc_files(i).name; nc_info = ncinfo(nc_file); % 获取需要转换为tif的数据变量名称,例如变量名为"temperature"。 % 这需要根据nc文件的具体结构来确定。 data_variable = 'temperature'; % 读取数据变量的内容 nc_data = ncread(nc_file, data_variable); % 将数据变量保存为tif文件 tif_file = fullfile('tif_files', nc_file(1:end-3) + ".tif"); imwrite(nc_data, tif_file); end ``` 在上述代码中,首先获取nc文件的名称,并使用ncinfo函数获取nc文件的信息。然后,指定需要转换为tif的数据变量的名称,例如"temperature"。通过ncread函数读取数据变量的内容,并使用imwrite函数将数据保存为tif文件。 最后,通过循环遍历所有的nc文件,并将它们转换为tif文件保存在之前创建的"tif_files"文件夹中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 96
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值