美赛整理之Matlab读取全球海洋温度数据并显示干货
程序员文章站
2024-03-24 18:42:04
...
Matlab读取全球海洋温度数据并显示干货
一.nc文件的读取
全球海洋温度从1981年到2000年的月度数据应该要从美国国家气象海洋管理局(NOAA)上下。格式是科学文件格式.nc。
Matlab有支持.nc文件读取的专用函数ncread。因此读出每月的全球温度应该不难。话不多说,直接给代码:
function h = ncplot(t)
InPath = 'D:\matlab\bin\matlab搜索路径D盘\MCM3_3';
file_name = '\sst.mnmean.nc';
boundary = [0 360 -90 90];
%文件打开与数据载入
source1 = strcat(InPath,file_name); %文件源,strcat函数:合并字符串
ncdisp(source1); %查阅NC文件信息
lon = ncread(source1,'lon'); %查阅经度信息
loncount = length(lon); %查阅经度的精度(有多少格点)
lat = ncread(source1,'lat'); %查阅纬度信息
latcount = length(lat); %查阅纬度精度(有多少格点)
time = ncread(source1,'time'); %查阅时间层数信息
ticount = length(time); %查阅时间层数
%disp('时间层数为:')
disp(ticount); %显示时间层数
%t = input('输入绘制的时间层:');
varname = 'sst'; %根据ncdisp显示的变量输入绘图
%查找绘制范围对应的所在矩阵的位置,相当于截取一小段矩阵
lon_scope = find(lon >= boundary(1) & lon<=boundary(2));
lat_scope = find(lat >= boundary(3) & lat<=boundary(4));
%绘制范围的数据量
lon_number = length(lon_scope);
lat_number = length(lat_scope);
start = [lon_scope(1),lat_scope(1),1]; %初始位置
count = [lon_number,lat_number,ticount]; %读取范围
stride1 = [1,1,1]; %读取步长
sst1 = ncread(source1,varname ,start,count,stride1);
sst_plot = imrotate(sst1(:,:,t), 90); %旋转矩阵,因为matlab是列优先
%墨卡托投影,规定绘制范围
m_proj('Mercator','lat',[boundary(3) boundary(4)],'lon',[boundary(1) boundary(2)]);
%生成网格
lat_1=linspace(boundary(3),boundary(4),lat_number);
lon_1=linspace(boundary(1),boundary(2),lon_number);
[plon,plat]=meshgrid(lon_1,lat_1);
hold on
%绘制图形
m_pcolor(plon,plat,sst_plot) %添加我们要画的内容
m_coast('color',[0 0 0],'linewidth',2); %绘制海岸线,填充陆地
m_grid('box','fancy') %添加边框
hold on
%添加标题
title('SST','fontsize',15) %标题
%添加色标
h = colorbar('h');
set(get(h,'title'),'string','摄氏度℃');
hold on
end
这里老茂把.nc文件放在了matlab的路径下了,完整的路径名和文件名如下:
'D:\matlab\bin\matlab搜索路径D盘\MCM3_3\sst.mnmean.nc'
要处理其他的.nc文件的话只需要自己把路径改为文件的存放路径就可以了。顺便说一下,这里的经度范围是从0°到180°,纬度是从-90°到90°。这是一个读取某一固定月份并且显示当前月份温度的函数,t代表从1981年开始计算的时间(以月为单位)。h是图句柄。这个代码得先从网上下载m_map工具箱到matlab的路径里,这样才能够画出海岸线来。
安装包具体的下载链接
二.画出从1981到2000年的全球温度海洋变化.gif图
用matlab画动态图,尤其是.gif图的方法和代码也总结了以下干货,直接拿去用就可以了。
clc,clear;
pic_num = 1;
for epsion = 1:458
ncplot(epsion);
drawnow;
F = getframe(gcf);
I = frame2im(F);
[I,map] = rgb2ind(I,256);
if pic_num == 1
imwrite(I,map,'test_sst.gif','gif','Loopcount',inf,'DelayTime',0.2);
else
imwrite(I,map,'test_sst.gif','gif','WriteMode','append','DelayTime',0.2);
end
pic_num = pic_num+1;
end
要是小伙伴想画其他的动态图的话只需要把代码里面的参数改一下就可以了。比如说,要让这个.gif有多少帧,只需要把代码第3行的458改成自己想要的帧数就可以了。(不过这个.nc文件里面最多只存了458个月份的数据。)如果想自定义画图的函数,只需要把第4行的ncplot函数换成自己想要的函数就可以了。
三.动态图
上一篇: 前端面试题
下一篇: go语言---goland开发环境设置