Matlab處理氣象數據(五)NCEP數據的剪裁、插值和兩套數據的對比

爲了更直觀地對比NCEP數據和觀測數據在中國大陸哪些區域中上升或者下降,需要對二者進行處理。NCEP數據爲全球數據,要對其進行剪裁,提取出中國區域,並將分辨率轉換爲與觀測數據相同的0.5°×0.5°的格點數據,此處可以使用interp2函數進行插值。

首先導入NECP數據中的TemData、LonData、LatData,剪裁與插值的代碼如下:

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:420
vi(:,:,i)=interp2(X,Y,TemData(:,:,i),xi,yi);%vi爲分辨率爲0.5的TemData
end

此時,已經得到了兩套範圍和分辨率均相同的數據,但NCEP數據在中國區域之外的範圍仍有數據,我們應先將其刪去。

load('vi.mat');%導入NCEP數據
load('T.mat');%導入觀測數據
%比較兩個數組,如果數組T爲NAN時,數組vi相對應位置也設爲NAN。
for i=1:420
for j=1:128
for k=1:72
if isnan(T(k,j,i))==1
vi(k,j,i)=nan;
end
end
end
end

pcolor函數可以查看數據生成的圖像,以1979年8月爲例,分別執行

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

得到處理後的兩套數據範圍圖。(圖略)

%求兩套數組的年平均氣溫
T2=reshape(T,[72*128,420]);
Tem2=nanmean(T2,1);
Tem2=reshape(Tem2,[12,35]);
Tem2=mean(Tem2,1);

T1=reshape(vi,[72*128,420]);
Tem1=nanmean(T1,1);
Tem1=reshape(Tem1,[12,35]);
Tem1=mean(Tem1,1);

plot函數查看兩套數據的年平均氣溫折線圖,分別執行plot(Tem1)plot(Tem2),得到:
在這裏插入圖片描述

兩套數據的年平均氣溫折線圖

爲了更直觀地展示兩套數據,可以用hold on函數將兩張圖放在一起:

plot(Tem1,'r.-','linewidth',2);%畫NCEP數據年平均氣溫折線圖,紅色實線實心點,線寬爲2
hold on
plot(Tem2,'b.-','linewidth',2);
legend({'NCEP','Observed'},'Location','Northwest');%添加圖例
set(gca,'xtick',[2 7 12 17 22 27 32],'xticklabel',{'1980','1985','1990','1995','2000','2005','2010'});%在x軸特定位置上添加標註
set(gca, 'FontSize',10,'FontWeight','Bold','tickdir','out') %設置標註爲10號字、加粗、標記線向外
h=xlabel('Year'); %設置x軸名稱
set(h, 'FontSize',10,'FontWeight','Bold')
h=ylabel('Temperarure(\circC)'); %設置y軸名稱
set(h, 'FontSize',10,'FontWeight','Bold') 
xlim([1 35])%x軸範圍鎖定爲1~35
box off %去掉外框
hold off

得到的圖像如下所示:
在這裏插入圖片描述

兩套數據年平均溫度對比圖

%求兩套數據的差值
DT=Tem2-Tem1;
plot(DT,'b.-','linewidth',2);
hold on
plot (DT-detrend(DT),'--','linewidth',2); %畫差值的趨勢線,用虛線表示
set(gca,'xtick',[2 7 12 17 22 27 32],'xticklabel',{'1980','1985','1990','1995','2000','2005','2010'})
set(gca, 'FontSize',10,'FontWeight','Bold','tickdir','out') %設置標註爲10號字、加粗、標記線向外
h=xlabel('Year'); %設置x軸名稱
set(h, 'FontSize',10,'FontWeight','Bold')
h=ylabel('Temperarure(\circC)'); %設置y軸名稱
set(h, 'FontSize',10,'FontWeight','Bold') 
xlim([1 35])%x軸範圍鎖定爲1~35
box off %去掉外框
hold off

得到下圖:
在這裏插入圖片描述

兩套數據年平均溫度的差異

以上是平均溫度的對比,最高溫度和最低溫度的對比與之類似。NCEP數據在NOAA網站下載最高溫度(tmax.2m.mon.mean.nc)和最低溫度(tmin.2m.mon.mean.nc)文件。需要注意的是,由於觀測數據的最高溫度和最低溫度缺失2012年11、12月和2013年4、5、6、7月,所以對於最高、最低溫度我們只分析1979-2011年的數據。

%提取NCEP的最高溫度數據
clc,clear;
AirData  = ncread('E:\數據\空間數據\NECP\tmax.2m.mon.mean.nc','tmax'); %讀入變量air
TimeData  = ncread('E:\數據\空間數據\NECP\tmax.2m.mon.mean.nc','time'); %讀入變量time
LonData  = ncread('E:\數據\空間數據\NECP\tmax.2m.mon.mean.nc','lon'); %讀入變量lon
LatData  = ncread('E:\數據\空間數據\NECP\tmax.2m.mon.mean.nc','lat'); %讀入變量lat
AirData=squeeze(AirData);%除去size爲1的維度,變爲三維
TemData = AirData-273.15; %開爾文溫度轉換爲攝氏度
TemData=permute(TemData,[2 1 3]);
[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:420
vimax(:,:,i)=interp2(X,Y,TemData(:,:,i),xi,yi);%vimax爲分辨率爲0.5的TemData
end

————————————————————————————————

%提取NCEP的最低溫度數據
clc,clear;
AirData  = ncread('E:\數據\空間數據\NECP\tmin.2m.mon.mean.nc','tmin'); %讀入變量air
TimeData  = ncread('E:\數據\空間數據\NECP\tmin.2m.mon.mean.nc','time'); %讀入變量time
LonData  = ncread('E:\數據\空間數據\NECP\tmin.2m.mon.mean.nc','lon'); %讀入變量lon
LatData  = ncread('E:\數據\空間數據\NECP\tmin.2m.mon.mean.nc','lat'); %讀入變量lat
AirData=squeeze(AirData);%除去size爲1的維度,變爲三維
TemData = AirData-273.15; %開爾文溫度轉換爲攝氏度
TemData=permute(TemData,[2 1 3]);
[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:420
vimin(:,:,i)=interp2(X,Y,TemData(:,:,i),xi,yi);%vimin爲分辨率爲0.5的TemData
end

%提取觀測數據最高溫度數據
clc,clear
for iyear=1979:2011
for imonth=1:12
    if(imonth>0&&imonth<=9)
Tpath=strcat('E:\數據\MAX\SURF_CLI_CHN_TEM_MON_GRID_0.5-MAX-',num2str(iyear),'0',num2str(imonth),'.txt'); 
    else
Tpath=strcat('E:\數據\MAX\SURF_CLI_CHN_TEM_MON_GRID_0.5-MAX-',num2str(iyear),'',num2str(imonth),'.txt');     
    end
Tmax(imonth,iyear-1978,:,:)=textread(Tpath);
end
end

for i=1:12
for j=1:33
for k=1:72
for l=1:128
if Tmax(i,j,k,l)==-99.0;
Tmax(i,j,k,l)=nan;
end
end
end
end
end

Tmax=reshape(Tmax,[396,72*128]);
Tem=nanmean(Tmax,2);
Tem=reshape(Tem,[12,33]);
Tem2=mean(Tem,1);
%plot(Tem2);
Tmax=reshape(Tmax,[396,72,128]);
Tmax=permute(Tmax,[2 3 1]);%使之成爲72*128*396型的矩陣
%使圖像顛倒,數據從最左下角向右上角讀起
for i=1:396
Tmax (:,:,i)=flipud(squeeze(Tmax (:,:,i)));
end

%提取觀測數據最低溫度數據
clc,clear
for iyear=1979:2011
for imonth=1:12
    if(imonth>0&&imonth<=9)
Tpath=strcat('E:\數據\MIN\SURF_CLI_CHN_TEM_MON_GRID_0.5-MIN-',num2str(iyear),'0',num2str(imonth),'.txt'); 
    else
Tpath=strcat('E:\數據\MIN\SURF_CLI_CHN_TEM_MON_GRID_0.5-MIN-',num2str(iyear),'',num2str(imonth),'.txt');     
    end
Tmin(imonth,iyear-1978,:,:)=textread(Tpath);
end
end
 
for i=1:12
for j=1:33
for k=1:72
for l=1:128
if Tmin(i,j,k,l)==-99.0;
Tmin(i,j,k,l)=nan;
end
end
end
end
end
 
Tmin=reshape(Tmin,[396,72*128]);
Tem=nanmean(Tmin,2);
Tem=reshape(Tem,[12,33]);
Tem2=mean(Tem,1);
%plot(Tem2);
Tmin=reshape(Tmin,[396,72,128]);
Tmin=permute(Tmin,[2 3 1]);%使之成爲72*128*396型的矩陣
%使圖像顛倒,數據從最左下角向右上角讀起
for i=1:396
Tmin(:,:,i)=flipud(squeeze(Tmin(:,:,i)));
end

至此,處理後的NCEP數據和觀測數據平均溫度、最高溫度和最低溫度分別保存爲vi.mat、vimax.mat、vimin.mat,T.mat、Tmax.mat、Tmin.mat。


相關鏈接:
Matlab處理氣象數據——目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章