使用matlab将多年温度数据在一个nc文件当中,按月和年分别转为tif文件

对于气象数据,大部分会把多月或者多年的数据放在一个nc文件当中,这里以月均温为例,数据来源:http://www.geodata.cn/data/datadetails.html?dataguid=164304785536614&docid=89

这里的月均温数据在2018年以前,是将三年的数据放在一个nc文件当中,也就是36个月的数据存储在了一个nc文件当中,如果想将这36个月的数据分别导出为tif,可以使用ArcGIS或者matlab处理,ArcGIS的方法这里就不介绍了,可以查看之前的教程:ArcGIS处理nc文件,这里主要介绍matlab将每个月的数据分别转为tif,代码如下:

clc;
clear;
%% 读取NC文件
datadir = 'F:\NWAF\tempmean\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']); %列出所有满足指定类型的文件

for year=2000:3:2015 %该数据集2018年以前每3年一个nc文件,文件名形式为tmp_2000_2002.nc
    ncFilePath=['F:\NWAF\tempmean\tmp_',num2str(year),'_',num2str(year+2),'.nc'];
    
%% 显示结构
    ncdisp(ncFilePath);%显示nc文件的所有结构,以便了解需要获取的数据的变量名称等信息

%% 读取变量值
    lon=ncread(ncFilePath,'lon');%读取经度变量
    lat=ncread(ncFilePath,'lat');%读取纬度变量
    time=ncread(ncFilePath,'time');%读取时间变量
    tmp=ncread(ncFilePath,'tmp');%从显示nc文件结构的步骤可以看到气温数据的变量名称是tmp
   
%% 批量输出为tif
   for k=1:36 %三年的数据被放在一个nc文件里,因此按月份顺序逐个读取
       tmp1=tmp(:,:,k); 
       data=flipud(tmp1');%南北翻转图像
       data(data==-32768)=NaN;%无数据区域设为NaN
        if k<=12 %第一年的12个月份,以此类推
        R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
        filename1=['F:\NWAF\meanTIF\tmp',num2str(year),'_',num2str(k),'.tif'];
        geotiffwrite(filename1,data,R);
        elseif (12<k)&&(k<25)
        R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
        filename1=['F:\NWAF\meanTIF\tmp',num2str(year+1),'_',num2str(k-12),'.tif'];
        geotiffwrite(filename1,data,R);   
        elseif 25<=k
        R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
        filename1=['F:\NWAF\meanTIF\tmp',num2str(year+2),'_',num2str(k-24),'.tif'];
        geotiffwrite(filename1,data,R);
        end
   end
end
 
for year=2018:2020 %该数据集2018年以后每年一个nc文件,文件名形式为tmp_2018.nc
     ncFilePath=['F:\NWAF\tempmean\tmp_',num2str(year),'.nc'];
     lon=ncread(ncFilePath,'lon');
     lat=ncread(ncFilePath,'lat');
     time=ncread(ncFilePath,'time');
     tmp=ncread(ncFilePath,'tmp');
     for k=1:12
     tmp1=tmp(:,:,k); 
     data=flipud(tmp1');
     data(data==-32768)=NaN;
     R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
     filename1=['F:\NWAF\meanTIF\tmp',num2str(year),'_',num2str(k),'.tif'];
     geotiffwrite(filename1,data,R);
     end
end 

来源:https://zhuanlan.zhihu.com/p/391362871?utm_id=0

也可以按年将每年的平均数据导出为tif,也就是将每年12个月的数据求和然后除以12,并将每年的数据导出,matlab代码如下:

clc;
clear;
%% 读取NC文件
ncFilePath = 'F:\Data\tmp_2009_2011.nc'; %指定批量数据所在的文件夹

%% 显示结构
    ncdisp(ncFilePath);%显示nc文件的所有结构,以便了解需要获取的数据的变量名称等信息

%% 读取变量值
    lon=ncread(ncFilePath,'lon');%读取经度变量
    lat=ncread(ncFilePath,'lat');%读取纬度变量
    time=ncread(ncFilePath,'time');%读取时间变量
    tmp=ncread(ncFilePath,'tmp');%从显示nc文件结构的步骤可以看到气温数据的变量名称是tmp
    year=2009;
%% 批量输出为tif
    data=flipud(rot90(tmp,1));%逆时针旋转图像,这里转出tif后可以先看一下数据的朝向以及是否需要翻转
    				%每种数据需要翻转和旋转的角度可能不一样,需要自己确定
    data(data==-32768)=NaN;%无数据区域设为NaN
    % 第一年的数据
    tmp12=data(:,:,1:12);
    sum_tmp12=sum(tmp12,3)/12.0;
    % 第二年的数据 
    tmp24=data(:,:,13:24);
    sum_tmp24=sum(tmp24,3)/12.0;
    % 第三年的数据 
    tmp36=data(:,:,25:36);
    sum_tmp36=sum(tmp36,3)/12.0;

    % 导出各个年份数据
    R = georasterref('RasterSize', size(sum_tmp12),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
    filename1=['F:\Data',num2str(year),'.tif'];
    geotiffwrite(filename1,sum_tmp12,R);

    R = georasterref('RasterSize', size(sum_tmp24),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
    filename1=['F:\Data',num2str(year+1),'.tif'];
    geotiffwrite(filename1,sum_tmp24,R);   

    R = georasterref('RasterSize', size(sum_tmp36),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);%地理栅格数据参考对象() 
    filename1=['F:\Data',num2str(year+2),'.tif'];
    geotiffwrite(filename1,sum_tmp36,R);

以上就是使用matlab将多年温度数据在一个nc文件当中,按月和年分别转为tif文件,更多内容可以关注公众号【GISerQ】。

你可能感兴趣的:(MATLAB,matlab,arcgis,开发语言,nc转tif)