利用MATLAB读取NC文件并绘图

您所在的位置:网站首页 arcgis函数怎么用 利用MATLAB读取NC文件并绘图

利用MATLAB读取NC文件并绘图

2023-03-14 14:54| 来源: 网络整理| 查看: 265

最近需要对很多NC 文件进行绘图,通常情况下,我一直用GMT,不过不知道为什么,笔记本上的GMT 用不了了,可能是版本的问题,但是我下了很多版本都无法使用,画出来的图都有问题。由于笔记本安装硬盘也就256G 分给了几十G 做了Linux系统,剩下的拷了很多国内的数据基本就满了。所以arcgis没有按,实际上,按了我也不会用。。。

昨天偶然看到了用人用MATLAB 读取NC文件绘图,觉得还不错。所以把代码下载下来研究了一天。从结果来看,比GMT 效果差点,不够灵活,画个箭头都要迂回一下。昨天搞到凌晨三点,快睡觉的时候,突然听到楼下老大爷猛烈的咳嗽,慌的不行,这老子没事天天出去,又经常在楼下烧烤,推着他老伴,拎着一个大音响,人老激情犹在。说是这么说,OHIO 都应这样了,慌还是很慌,于是早上就把空调的出风口给关了,彻底隔绝了和一楼的联系。总之,我对老美这种明知道外面病毒漫天还非拉着老伴浪漫烧烤不考虑自己七老八十所剩无几的免疫力多余力气也就够支撑那个沉甸甸的肚子生死无惧誓要人权轴到根子里二杆子打不出一个回笼屁的精神,佩服的是五体投地,无话可说,无可奈何,无能无力。。。

算了,他有上帝,我没有,我比不过。不扯了,说回正事,今天又折腾了一下午,终于得到了自己想要的图,于是简单归纳下。

这是 比较专业的说明网站:https://www.eoas.ubc.ca/~rich/map.html

其他的个人博客,CSDN,以及网上的东西,都写的乱七八糟的,看的人都晕。所以推荐大家用这个。这是他的一些样本图,可以看出基本满足我们的需求:

首先要用的脚本是m_map,在网上都很容易找到。下载以后放到MATLAB目录去。使用help m_map查看所有的功能。

导入NC文件,这个应该比较简单,包括单个文件的读取以批处理可以使用以下代码:

lon = ncread('路径','LON');

lat = ncread('路径','LAT');

批处理:

datadir='路径\'; %指定批量数据所在的文件夹

filelist=dir([datadir,'*.nc']); %指定批量数据的类型

k=length(filelist);

for s=1:100%假设100文件

filename=[datadir,filelist(s).name];

ncid=netcdf.open(filename,'NC_NOWRITE');

SMB{s}= ncread(filename,'SMB'); %读入变量

netcdf.close(ncid); % 关闭文件

end;

2. 进行绘图

事实上,很多NC 文件是气象或者地学专用,因此他的经纬度很多情况下是极坐标或者XY 坐标,并不是简单的经纬度,比如这样的:

按着等距离做的格网文件。这种情况下,经纬度和数值格网基本都是2D。也就是一个经度,一个纬度,一个值。而不是单纯的180到-180 ,90到-90。事实上我使用原始经纬度作图,但是一直报错,我参考了别人的代码,我发现他要求的经纬度格式应该是这样的:

也就是需要按行或者按列递增或者递减。因此地理长度坐标这里就不能用。所以我对数据进行了重采样,代码可以参考这个:

3. 准备好数据文件,接着就是作图,我的代码如下:

这里的各函数的作用可以直接在说明文档里查看。需要注意的是投影的选择。'rec', 'on' 这个开与关是一个正交的作用,大致对比如下,如果是off:

但是这种图是不太好看的,尤其是很多图需要排版时,所以参数可以选择“on”,效果如下:

4.另一个很麻烦的是,MATLAB没有自带的函数可以直接在点上画出箭头。有一个函数annotation ,用到是可以用,但是他的位置参数不是咱们的自己的经纬度坐标,而是xy 的值,如果很多点需要箭头就需要一个个调整,很麻烦。而m_map,我找了半天也没有看到,最多就是可以画圆圈。因此我只能选了他里面的一个速度场函数m_vec,

h1=m_vec(1 ,-37,64,0,5/20,'k','shaftwidth',1,'headlength',5,'key',{'5 mm','transient'});

代码很简单,但是当时一直困扰我的是,如果加入了参数‘key’,箭头方向就不能调整,一直是横的。。。。无奈。

所以绘制需要移除这个参数:

h2= m_vec(1,transient(i,1),transient(i,2),-0,transient(i,3)/20,'r', 'centered','yes','shaftwidth',0.05,'headlength',4);

里面的的参数数值很简单,第一个是比例因子,后面就是经纬度和数值,‘r’是红色。在后面就是对箭头样式的设置。值得注意的是,速度场的数值好像必须是俩分量,单独一个就报错,所以我不明白他这个函数怎么绘制U方向的速度场。因此我只能把其中一个参数设置为0,这样才能让最后的箭头指向U。网上也有个代码arrow的 ,但是我调试了一下,没有成功。

但事实上它 还是不如专业的绘图软件做的好,比如我师弟用arcgis帮我画的:

唯一的好处是,对批量的NC 文件可以一边处理,一边绘图。当然如果你只是想看NC 文件内容,你可以下载一个panoply:

当然其实m_map 也很强大,它里面自带了海岸线数据,地形数据貌似也有,不过我没用,他的功能也很多,画出来的图也很棒,不过需要自己慢慢摸索:

这算一个辅助工具。在不重要的结果图中,可以使用他,如果是比较重要的结果,我建议还是用相应的专业的软件绘制。

就这样~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3