爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11875|回复: 12

[源程序] 对NOAA的OISST陆地上的SST数据的剔除。

[复制链接]

新浪微博达人勋

发表于 2017-7-20 08:14:21 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 skylark 于 2017-7-20 15:24 编辑

最近的一个Program用到了NOAA的OISST的SST数据,发现OISST的SST在陆地上还有数据,于是查了下官网 :“[size=13.6937px]The OI analysis is done over all ocean areas and the Great Lakes. There is no analysis over land. The land values are filled by a Cressman interpolation to produce a complete grid for possible interpolation to other grids. The ocean and land areas are defined by a land sea mask (the lsmask.nc file). Land values for sst do not necessarily coincide with land values from ice analysis”,官网解释陆地上的数据是克雷斯曼插值得到的,可以用官网给的lsmask.nc文件来剔除陆地上的数据,楼主用matlab打开了lsmask.nc文件,是一个360 x 180矩阵由1和0组成,其中1代表着海洋,0代表着陆地(用grads的set clevs 0或者1后d mask得出结论)。与之前一位同学的结论一致,不过她给的是Fortran的代码(这里给出她的帖子作为参考:http://bbs.06climate.com/forum.p ... 41303&extra=&page=1),楼主已经2,3年没用过了Fortran了,所以就编了个 matlab版本的,方便以后用,毕竟NOAA的OISST的数据以后还是要经常用到的。


代码:

%提取数据
sst=ncread('e:/SouthAfrica/sst.mnmean.nc','sst');
nlat=ncread('e:/SouthAfrica/sst.mnmean.nc','lat');
nlon=ncread('e:/SouthAfrica/sst.mnmean.nc','lon');
nt=ncread('e:/SouthAfrica/sst.mnmean.nc','time');
mask=ncread('e:/SouthAfrica/lsmask.nc','mask');

prep_bimodal_use=importdata('e:/SouthAfrica/prep_bimodal_use_420.mat');
prep_unimodal_use=importdata('e:/SouthAfrica/prep_unimodal_use_420.mat');

%剔除陆地数据
[I,J]=find(mask==0);
for i=1:length(I)
        sst(I(i),J(i),:)=nan;
end;
%处理后的sst就为剔除掉陆地上数据的sst数据

代码已进行验证,没有问题。

用到的lsmask.nc可以在官网下载: https://www.esrl.noaa.gov/psd/da ... .noaa.oisst.v2.html

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-20 14:13:29 | 显示全部楼层
weinihou 发表于 2017-7-20 12:14
我见到过好几个把MATLAB当Fortran使的,真的,可人家Fortran95也是能搞类似切片那种操作的,不用说什么20 ...

这位同学,你要觉得我编的程序的复杂,你可以直接给我说是否有更好的方法我肯定接受,,你这样酸溜溜讽刺有意思?
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2017-7-20 15:14:46 | 显示全部楼层
本帖最后由 skylark 于 2017-7-20 15:17 编辑
二爷名声在外 发表于 2017-7-20 15:02
可以试一下
sst(mask==0)=nan
没在三维矩阵上试过……

我试了下,不可以的,sst(mask==0)=nan后,只有sst(:,:,1)是变为nan了,后面都没处理
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 成长值: 32430
发表于 2017-7-20 10:06:39 | 显示全部楼层
说句实话,看见楼主居然用循环,感觉有点好玩~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-20 10:39:29 | 显示全部楼层
二爷名声在外 发表于 2017-7-20 10:06
说句实话,看见楼主居然用循环,感觉有点好玩~

版主有什么更简单的?求指教!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-20 10:39:37 | 显示全部楼层
二爷名声在外 发表于 2017-7-20 10:06
说句实话,看见楼主居然用循环,感觉有点好玩~

版主有什么更简单的?求指教!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2017-7-20 10:48:06 | 显示全部楼层
find
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-7-20 12:14:01 | 显示全部楼层
二爷名声在外 发表于 2017-7-20 10:06
说句实话,看见楼主居然用循环,感觉有点好玩~

我见到过好几个把MATLAB当Fortran使的,真的,可人家Fortran95也是能搞类似切片那种操作的,不用说什么2003 2008啥的,感觉他们好会玩儿

开心就好
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-20 14:50:54 | 显示全部楼层

版主我搜了下find,改了下,你看看这样是不是简化一点了?还能在简化吗?

sst=ncread('e:/sst.mnmean.nc','sst');
mask=ncread('e:/lsmask.nc','mask');
[I,J]=find(mask==0);
for i=1:length(I)
sst(I(i),j(i),:)=nan;
end;
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2017-7-20 15:02:07 | 显示全部楼层
可以试一下
sst(mask==0)=nan
没在三维矩阵上试过……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-20 15:14:41 | 显示全部楼层
二爷名声在外 发表于 2017-7-20 15:02
可以试一下
sst(mask==0)=nan
没在三维矩阵上试过……

我试了,可以的!感谢,太厉害了!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表