Matlab處理氣象數據(六)數據的面積加權

由於地理投影導致導致每個像元實際地面面積不同,越靠近北極實際面積越小,越靠近赤道實際面積越大,如果不進行面積加權就簡單平均,會導致溫度較實際溫度偏低。

用以下公式計算地理投影每個像元的面積:

double pi = 3.1415926;
double R = 6371007.181; //units - m						
double area = (pi/180.0)*R*R*fabs(sin(dLat1/180.0*pi) - sin(dLat2/180.0*pi)) * fabs(dLon1 - dLon2);

其中,dLat1, dLat2是像元上下邊界(北南)的緯度,dLon1, dLon2是像元左右邊界的經度。

下面分別對觀測數據和NCEP數據的平均、最高、最低溫度進行面積加權平均:

%對觀測數據平均溫度進行面積加權
load('T.mat');%導入觀測數據72*128*420
%計算實際面積
R =  6371007.181;
dLat1=18.5:0.5:54;
dLat2=18:0.5:53.5;
dLon1=72:0.5:135.5;
dLon2=72.5:0.5:136;
for i=1:72
for j=1:128
area(i,j) = (pi/180.0)*R*R*abs(sin(dLat1(i)/180.0*pi) - sin(dLat2(i)/180.0*pi)) * abs(dLon1(j) - dLon2(j));
end
end
%將T爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(T(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WT=zeros(1,420);
for t=1:420
WT(t)=0;
for i=1:72
for j=1:128
if isnan(T(i,j,t))==1;
continue
else
WT(t)=WT(t)+T(i,j,t).*W(i,j);
end
end
end
end
WT2=reshape(WT,[12,35]);
Tem2=mean(WT2,1);
plot(Tem2);

%對觀測數據最高溫度進行面積加權
load('Tmax.mat');%導入觀測數據72*128*396
%計算實際面積
R =  6371007.181;
dLat1=18.5:0.5:54;
dLat2=18:0.5:53.5;
dLon1=72:0.5:135.5;
dLon2=72.5:0.5:136;
for i=1:72
for j=1:128
area(i,j) = (pi/180.0)*R*R*abs(sin(dLat1(i)/180.0*pi) - sin(dLat2(i)/180.0*pi)) * abs(dLon1(j) - dLon2(j));
end
end
%將Tmax爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(Tmax(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WT=zeros(1,396);
for t=1:396
WT(t)=0;
for i=1:72
for j=1:128
if isnan(Tmax(i,j,t))==1;
continue
else
WT(t)=WT(t)+Tmax(i,j,t).*W(i,j);
end
end
end
end
WTmax2=reshape(WT,[12,33]);
Temmax2=mean(WTmax2,1);
plot(Temmax2);

%對觀測數據最低溫度進行面積加權
load('Tmin.mat');%導入觀測數據72*128*396
%計算實際面積
R =  6371007.181;
dLat1=18.5:0.5:54;
dLat2=18:0.5:53.5;
dLon1=72:0.5:135.5;
dLon2=72.5:0.5:136;
for i=1:72
for j=1:128
area(i,j) = (pi/180.0)*R*R*abs(sin(dLat1(i)/180.0*pi) - sin(dLat2(i)/180.0*pi)) * abs(dLon1(j) - dLon2(j));
end
end
%將Tmin爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(Tmin(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WT=zeros(1,396);
for t=1:396
WT(t)=0;
for i=1:72
for j=1:128
if isnan(Tmin(i,j,t))==1;
continue
else
WT(t)=WT(t)+Tmin(i,j,t).*W(i,j);
end
end
end
end
WTmin2=reshape(WT,[12,33]);
Temmin2=mean(WTmin2,1);
plot(Temmin 2);

%對NCEP數據平均溫度進行面積加權
load('vi.mat');%導入NCEP數據72*128*420
load('area.mat');%導入面積數據72*128
load('T.mat');%導入觀測數據72*128*420
%比較兩個數組,如果數組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
%將vi爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(vi(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WT1=zeros(1,420);
for t=1:420
WT1(t)=0;
for i=1:72
for j=1:128
if isnan(vi(i,j,t))==1;
continue
else
WT1(t)=WT1(t)+vi(i,j,t).*W(i,j);
end
end
end
end
Tem1=reshape(WT1,[12,35]);
Tem1=mean(Tem1,1);
plot(Tem1);

%對NCEP數據最高溫度進行面積加權
load('vimax.mat');%導入NCEP數據72*128*420
load('area.mat');%導入面積數據72*128
load('Tmax.mat');%導入觀測數據72*128*420
%比較兩個數組,如果數組Tmax爲NAN時,數組vimax相對應位置也設爲NAN。
for i=1:396
for j=1:128
for k=1:72
if isnan(Tmax(k,j,i))==1
vimax(k,j,i)=nan;
end
end
end
end
%將vimax爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(vimax(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WTmax1=zeros(1,420);
for t=1:420
WTmax1(t)=0;
for i=1:72
for j=1:128
if isnan(vimax(i,j,t))==1;
continue
else
WTmax1(t)=WTmax1(t)+vimax(i,j,t).*W(i,j);
end
end
end
end
Temmax1=reshape(WTmax1,[12,35]);
Temmax1=mean(Temmax1,1);
plot(Temmax1);

%對NCEP數據最低溫度進行面積加權
load('vimin.mat');%導入NCEP數據72*128*420
load('area.mat');%導入面積數據72*128
load('Tmin.mat');%導入觀測數據72*128*420
%比較兩個數組,如果數組Tmin爲NAN時,數組vimin相對應位置也設爲NAN。
for i=1:396
for j=1:128
for k=1:72
if isnan(Tmin(k,j,i))==1
vimin(k,j,i)=nan;
end
end
end
end
%將vimin爲NAN時area對應位置上也設爲NAN
for i=1:72
for j=1:128
if isnan(vimin(i,j,1))==1
area(i,j)=nan;
end
end
end
a = nansum(area(:));%求像元的總面積
%求面積的權值W
for i=1:72
for j=1:128
W(i,j)= area(i,j)/a;
end
end
%計算加權後的溫度
WTmin1=zeros(1,420);
for t=1:420
WTmin1(t)=0;
for i=1:72
for j=1:128
if isnan(vimin(i,j,t))==1;
continue
else
WTmin1(t)=WTmin1(t)+vimin(i,j,t).*W(i,j);
end
end
end
end
Temmin1=reshape(WTmin1,[12,35]);
Temmin1=mean(Temmin1,1);
plot(Temmin1);

至此,進行面積加權處理後的NCEP數據和觀測數據平均溫度、最高溫度和最低溫度分別保存爲Tem1 .mat、Temmax1.mat、Temmin1.mat,Tem2.mat、Temmax2.mat、Temmin2.mat。

%面積加權後的兩套數據平均、最高、最低溫度對比
DT = Tem2 - Tem1;
DTmax = Temmax2 - Temmax1;
DTmin = Temmin2 - Temmin1;
plot(DT,'r.-','linewidth',2);
hold on
plot(DTmax,'b.-','linewidth',2);
plot(DTmin,'g.-','linewidth',2);
legend({'DT','DTmax','DTmin'},'Location','Northwest');%添加圖例
plot (DTmax-detrend(DTmax),'b--','linewidth',2);
plot (DTmin-detrend(DTmin),'g--','linewidth',2);
plot (DT-detrend(DT),'r--','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

得到下圖:

在這裏插入圖片描述

兩套數據年平均、最高、最低溫度的差異

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

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