由于地理投影导致导致每个像元实际地面面积不同,越靠近北极实际面积越小,越靠近赤道实际面积越大,如果不进行面积加权就简单平均,会导致温度较实际温度偏低。

用以下公式计算地理投影每个像元的面积:

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处理气象数据——目录

点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐