MATLAB读入并处理全球DAT格式气温数据

clc 
clear

% 读入.dat文件到变量temp_month
temp_month=dlmread('F:\GIS\yuan\cru_ts4.02.2001.2010.tmp.dat'); % dlmread function read ASCII-delimited file of numeric data into matrix

% 将二维矩阵temp_month(43200*720)升为三维矩阵temp_year_3d(4320*720*10)
temp_year2=mat2cell(temp_month,[4320 4320 4320 4320 4320 4320 4320 4320 4320 4320],[720]); %10个4320,表示10年
temp_year_3d=cat(3,temp_year2{:});

[rows,columns,pages]=size(temp_year_3d);  %返回三维矩阵行、列、页数

% 对三维矩阵temp_year_3d(4320*720*10)的每一页拆分成360*720*12大小并求各页平均,得到全球0.5°逐年年均温网格
for page=1:pages
    temp_month2=mat2cell(temp_year_3d(:,:,page),[360 360 360 360 360 360 360 360 360 360 360 360],[720]); %12个360,表示12个月
    temp_month_3d=cat(3,temp_month2{:});
    temp_year(:,:,page)=mean(temp_month_3d,3); %temp_year(:,:,:)为全球1901~1910年逐年平均气温ASCII数据
end

% *************读新的数据时修改以下代码 num2str(page+1900)****************************
% 将二维数组temp_year(:,:,page)(360*720)分别写入1901.txt,1902.txt,1903.txt...
for page=1:pages
    str=['F:/GIS/yuan/globe_temp/' num2str(page+2000) '.txt']  % num2str(page+1900)前后都要空一格
    fid=fopen(str,'wt');
    
    %% 插入文件头
    fprintf(fid,'%s\n','ncols 720');
    fprintf(fid,'%s\n','nrows 360');
    fprintf(fid,'%s\n','xllcorner -180.00');
    fprintf(fid,'%s\n','yllcorner -90.00');
    fprintf(fid,'%s\n','cellsize 0.50');
    fprintf(fid,'%s\n','NODATA_value -999');
    %% 写入数据    
    input=flipud(temp_year(:,:,page));  % 注意这里要用到flipud()函数,将数组上下颠倒,这样根据文件头读入的数据才是对的,另外再次印证MATLAB真的很强大
    [row_temp,col_temp]=size(input);

    for row=1:row_temp
        for col=1:col_temp
            if col==col_temp
                fprintf(fid,'%g\n',input(row,col));
            else
                fprintf(fid,'%g\t',input(row,col));
            end
        end
    end
        
    fclose(fid);
end
figure  %提示运行结束
展开阅读全文

没有更多推荐了,返回首页