NCEP数据预处理--MATLAB

NCEP数据预处理

1、数据读取+数值转换

数据说明:
在这里插入图片描述
数据集:
在这里插入图片描述

%多文件循环
clc
clear
% NCEP气象数据处理 +转tif
output = 'D:\Factor\Climate\NCEPTIF\' ; %输出位置
Year = 2000;  %截取的起始年份

datadir = 'D:\Factor\Climate\NCEP\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']);       %列出所有满足指定类型的文件
k=length(filelist);

for i = 2  %依次读取并处理
    ncFilePath = [datadir,filelist(i).name];
Name = ncFilePath(24:size(ncFilePath,2)-4);
ncdisp(ncFilePath); %查看NC结构(读取头文件)
% ncid = netcdf.open(ncFilePath,'NOWRITE'); %打开nc文件
 
%% 读取数据
AirData1  = ncread(ncFilePath,'air'); %读入变量air
TimeData  = ncread(ncFilePath,'time'); %读入变量time
lon  = ncread(ncFilePath,'lon'); %读入变量lon
lat  = ncread(ncFilePath,'lat'); %读入变量lat
Time_bndsData  = ncread(ncFilePath,'time_bnds'); %读入变量time_bnds
Timestr = datestr(datenum('1800-01-01 00:00:0.0') + TimeData./24);   %时间字符串
Time = datevec(datenum('1800-01-01 00:00:0.0') + TimeData./24);  %时间数字

%% 数值处理
AirData=squeeze(AirData1);%除去size为1的维度,变为三维<192*94*420double>
TemData1 = AirData-273.15; %开尔文温度转换为摄氏度
A = find(Time(:,1)==Year);  %找到需要的年份所在位置
TemData = TemData1(:,:,A(1):size(TemData1,3));

%% 转tif
 data=TemData;
%逆时针旋转90°
data = rot90(data);
%顺时针旋转90 %data = rot90(data,-1);
    % 上下翻转%data=flipud(npp);  
    % 左右翻转%MonthData = fliplr(MonthData)
%% 写入TIFF
    R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
    geotiffwrite([output,Name,num2str(Year),'-.tif'],data,R);
    disp([Name,'done'])

2、批量nc转TIFF((单独)另外创建文本)

clc
clear
%批量nc转tif
output = 'D:\Factor\Climate\NCEPTIF\'  %输出位置

%% 批读取NC文件的准备工作
datadir = 'D:\Factor\Climate\NCEP\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']);       %列出所有满足指定类型的文件
k=length(filelist);

for i = 1:k  %依次读取并处理
    %% 批量读取NC文件
    ncFilePath = [datadir,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');%获取降雨变量数据 
    
    %% 存为tif格式
    data=flipud(pre');                 %很重要,这是镜像反转,否则最后的图像的南北朝向是错的
    R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
    geotiffwrite([output,num,'.tif'],data,R);
    disp([num,'done'])
    
end
disp('finish!')

3、全球数据绘图(接1)

LatData=lat   ;LonData=lon;
%% 绘图
figure
[X, Y] = meshgrid(LatData,LonData);
pcolor(Y-179.0625,X,TemData(:,:,9)); %以第一年的9月为例,画颜色填充图
shading flat;%去掉网格线
colorbar('SouthOutside','Position',[0.142,0.15,0.75,0.04]); %添加颜色条 [左右,上下,长,宽]

load coast; %加载全球海岸线,但是不显示出来
geoshow(lat,long-179.0625); %显示出海岸线,lat和long是coast的属性

hold on;
set(gca,'LineWidth',1,'FontSize',10,'Ylim',[-88.5420,88.5420],'Xlim',[-179.0625,179.0625],'Position',[0.142,0.15,0.75,0.84]...
   ,'XTick',[-180:60:180],'XTicklabel',{
    
    '-180W','-120W','-60W','0','60E','120E','180E'}...
   ,'YTick',[-90:30:90],'YTicklabel',{
    
    '-90S','-60S','-30S','0','30N','60N','90N'}); %添加经纬度信息
hold off;

netcdf.close(ncid); %关闭nc文件

4、裁剪(中国)、插值(建议用arcgis裁剪、重采样)

%% 裁剪+插值
TemData=permute(TemData,[2 1 3]); %改变维数顺序,即将<192x94x420 >变为<94x192x420 >
[X,Y]=meshgrid(LonData,LatData);
[xi,yi]=meshgrid(72:0.5:135.5,18:0.5:53.5); %只要72~135.5E,18~53.5N这个范围的数据
for i=1:size(TemData,3)
    %二维插值函数interp2()  'linear' :双线性插值算法(缺省算法); 'nearest' :最临近插值;'spline' :三次样条插值; 'cubic' :双三次插值。
	vi(:,:,i)=interp2(X,Y,TemData(:,:,i),xi,yi); %vi为分辨率为0.5的TemData  
end

figure
pcolor(vi(:,:,8));
shading flat;

批量转tif代码汇总

clc
clear
% NCEP气象数据处理 +转tif  分年
output = 'D:\Factor\Climate\NCEPTIF\' ; %输出位置
Year = 2000;  %截取的起始年份
level = 1;  %选取level

Namedata={
    
    'air','air','pevpr','pr_wtr','prate','pres','rhum','tmax','tmin','wspd','wspd'}; %自己看一下应该获取的数据名
datadir = 'D:\Factor\Climate\NCEP\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']);       %列出所有满足指定类型的文件
k=length(filelist);

for i = 1  %依次读取并处理
    ncFilePath = [datadir,filelist(i).name];
Name = ncFilePath(24:size(ncFilePath,2)-3);
ncdisp(ncFilePath); %查看NC结构(读取头文件)
% ncid = netcdf.open(ncFilePath,'NOWRITE'); %打开nc文件
 
%% 读取数据
AirData1 = ncread(ncFilePath,Namedata{
    
    i}); %读入变量air
if i==2 || i==7  || i==11
AirData1 = AirData1(:,:,level,:);
end
TimeData  = ncread(ncFilePath,'time'); %读入变量time
lon  = ncread(ncFilePath,'lon'); %读入变量lon
lat  = ncread(ncFilePath,'lat'); %读入变量lat
Time_bndsData  = ncread(ncFilePath,'time_bnds'); %读入变量time_bnds
Timestr = datestr(datenum('1800-01-01 00:00:0.0') + TimeData./24);   %时间字符串
Time1 = datevec(datenum('1800-01-01 00:00:0.0') + TimeData./24);  %时间数字

%% 数值处理
AirData=squeeze(AirData1);%除去size为1的维度,变为三维<192*94*420double>
i
if i==1 || i==2 ||i==8 || i==9
    TemData1 = AirData-273.15; %开尔文温度转换为摄氏度
else
    TemData1 = AirData;
end
NumYear = find(Time1(:,1)==Year);  %找到需要的年份所在位置
TemData = TemData1(:,:,NumYear(1):size(TemData1,3));
Time = Time1(NumYear(1):size(TemData1,3),:);

  %% 裁剪+插值
TemData=permute(TemData,[2 1 3]); %改变维数顺序,即将<192x94x420 >变为<94x192x420 >
[X,Y]=meshgrid(lon,lat);
[xi,yi]=meshgrid(72:0.5:135.5,18:0.5:53.5); %只要72~135.5E,18~53.5N这个范围的数据
for i=1:size(TemData,3)
    %二维插值函数interp2()  'linear' :双线性插值算法(缺省算法); 'nearest' :最临近插值;'spline' :三次样条插值; 'cubic' :双三次插值。
	TemData_inter(:,:,i)=interp2(X,Y,TemData(:,:,i),xi,yi); %vi为分辨率为0.5的TemData  
end
%% 转tif
 data=TemData_inter;
%逆时针旋转90°
data = rot90(data);
%顺时针旋转90 %data = rot90(data,-1);
    % 上下翻转%data=flipud(npp);  
    % 左右翻转%MonthData = fliplr(MonthData)

    %% 写入TIFF
mkdir(strcat('D:\Factor\Climate\NCEPTIF\',Name))  %创建文件夹
for I=1:2 %size(data,3)
Data = data(:,:,I);

    R = georasterref('RasterSize', size(Data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
    geotiffwrite([output,Name,'\',Name,num2str(Year),num2str(Time(I,2)),'.tif'],data,R);
    disp([Name,num2str(Time(I,1)),num2str(Time(I,2)),'done']);
end

end

猜你喜欢

转载自blog.csdn.net/weixin_44083023/article/details/130257232