- 积分
- 2001
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-12-5
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 映山红 于 2015-6-10 11:39 编辑
二进制文件最令人头疼,因为你不知道文件堆放方式,而带有文件头的二进制文件更是烦人。这里需处理0.5度的CRU平均气候态(1961-1990)格点温度、风速和水汽压资料。CRU高分辨率格点资料下载网址:http://www.cru.uea.ac.uk/cru/data/hrg/(图1)
只有CRU CL v.1.0符合我们的要求。点击Link to data (at IPCC DDC)转到下面数据下载页,发现数据为二进制格式,下载解压后,后缀名竟然为.dat!顿时感觉整个人都不好了!(图2)
第1种方法用importdata读取之:
a=importdata('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat'); 结果为结构体a,包含data、textdata和colheaders三个子变量。(图3)
a.colheaders中的数据如下:(图4)
a.data中的数据如下:(图5)
a.colheaders与a.data第1行一一对应可得数据属性:grd_sz=0.5 ,xmin=0.2500,ymin=-89.7500,xmax=359.7500, ymax=89.7500,n_cols=720,n_rows=360,n_months=12。说明数据为0.5度,经度:0.25:0.5:359.75,纬度:-89.75:0.5:89.75,720列(经向),360行(纬向),12个月。a.data第1行以后的主体数据个数应为:720 x 360 x 12。但由于文件头的存在,主体数据已变形为8列数据。下面得猜测原数据如何存放,以确定该如何还原。我试了很多次,用contourf绘图后都是乱码,说明还原方式错误。真令人头疼!
不过最后还是被我还原成功!代码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a=importdata('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat');
b=a.data(2:388801,:)'; %去掉第1行
b(b<-9000)=nan; %处理缺失值
b=b*0.1; %乘以0.1还原成实际温度值
c=reshape(b,720,360*12); %还原成720 x 4320 的矩阵
t(1:360,1:720,1:12)=0;
for i=1:12
t(:,:,i)=rot90(c(1:720,(i-1)*360+1:i*360)); %还原成360 x 720 x 12 的三维格点矩阵
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
绘制1961年的全球温度气候态分布图:contourf(t(:,:,1)),图是正确的,还原数据完成!(图6)
第2种方法用fopen等语句读取:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fid=fopen('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat','r');
title1=fgetl(fid) %用fgetl函数读掉前两行头文件,后面fscanf函数接着从第3行开始读取
title2=fgetl(fid)
a=fscanf(fid,'%f',[720,inf]); %以720 x inf (4320) 矩阵形式读出
a(a<-9000)=nan;
c=a*0.1;
t(1:360,1:720,1:12)=0;
for i=1:12
t(:,:,i)=rot90(c(1:720,(i-1)*360+1:i*360)); %还原成360 x 720 x 12 的三维格点矩阵
end
fclose(fid)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
第1种方法用importdata读取时,由于文件头存在,导致矩阵变形,造成后面还原数据的困难。(若另存.dat文件副本,强行把后缀名改为.txt,然后打开,删除头文件,再把后缀名改为.dat,用importdata读取后数据仅为1列,仍需设法还原之)。相比之下,第2种方法读取数据就要简单迅速得多了。
|
-
CRU高分辨率资料下载列表
-
IPCC DDC
-
三个子变量
-
a.colheaders中数据
-
a.data中数据
-
1961年全球温度气候态分布图
评分
-
查看全部评分
|