ToB企服应用市场:ToB评测及商务社交产业平台
标题:
MATLAB绘制台风(Tropical cyclones)风场(Wind field)图、风场动画(Animati
[打印本页]
作者:
圆咕噜咕噜
时间:
2024-10-16 15:44
标题:
MATLAB绘制台风(Tropical cyclones)风场(Wind field)图、风场动画(Animati
简介
风场数据来源ERA5再分析数据集,下载方式网上有许多教程就不重复造轮子了 :
Copernicus Climate Data Store | Copernicus Climate Data Store,也可以直接下载我后文分享的已经下载好的数据进行学习。
台风案例选择了闻名的2015年9号超强台风灿鸿,下图绘出了台风灿鸿的轨迹,数据来源海洋科学大数据中心的中国近海台风路径聚集数据集
风场数据时间选择2015-07-01到2015-07-14,时间分辨率1h,经度范围(110,160)°E,纬度范围(5,45)°N
绘出如下台风期间风场演变,可以清晰看到台风的结构和影响范围
固然也可以生成动画版本的,方便用于演示
原始数据
下面直接分享上面提到的台风轨迹、台风期间再分析数据,仅作学习用途,具体请参考相关网站
通过百度网盘分享的文件:灿鸿风场
链接:https://pan.baidu.com/s/1uJgGYYhqdQa0OKkIETo6nw?pwd=6666
提取码:6666
代码
接下来直接分析绘制风场及其动画的代码
起首读取路径下的数据
% 读取ERA5数据
% ncinfo("ERA5.nc") 用于了解NC文件结构
lon = ncread("ERA5.nc",'longitude'); %longitude
lat = ncread("ERA5.nc",'latitude'); %latitude
date = ncread("ERA5.nc",'time'); %时间
date = datetime(1900,1,1) + double(date(:))/24; %时间格式转化
u = ncread("ERA5.nc",'u10'); %速度u分量
v = ncread("ERA5.nc",'v10'); %速度v分量
speed = sqrt(u.^2+v.^2); %速度
复制代码
随后生成m_map的project,在这个project基础上绘制.gif台风动画
% 生成m_map project
m_proj('Equidistant Cylindrical','long',[110 160],'lat',[5 45]);
% 计算坐标对应地图位置
X=[];
Y=[];
for i=1:length(lon)
for j=1:length(lat)
[CX,CY]=m_ll2xy(lon(i),lat(j));
X(i,j)=CX;
Y(i,j)=CY;
end
end
for i=1:6:length(date)
figure;
% 绘制风场
hold on
contourf(X,Y,(speed(:,:,i)),15,'linestyle','none');
% 海岸线
m_coast('patch',[.8 .8 .8]);
% 绘制边框
m_grid('box','on','tickdir','in','backcolor',[1,1,1],'xtick',[],'ytick',[],'LineWidth',1.5);
hold off
% 生成colorbar
cb = colorbar;
cb.FontSize=14;
cb.Label.String='Wind speed (m/s)';
% 颜色设置
cr1 = flipud(slanCM(167));%彩色
cr2 = slanCM(25);%灰色
colormap([cr2(1:3:83,:);flipud(cr1(1:2:end-3,:))]);% 将低风速设置为灰色,突出高风速台风区域
% 日期
XLB = xlabel(string(date(i)),'FontSize',15,'FontWeight','bold');
set(XLB,'Units','normalized','Position',[0.5,0],'HorizontalAlignment','center','VerticalAlignment','top')
frame = getframe(gcf);
im = frame2im(frame);
[I,map] = rgb2ind(im,256);
if i == 1
imwrite(I,map,'windfield.gif','gif', 'Loopcount',inf,'DelayTime',1);
else
imwrite(I,map,'windfield.gif','gif','WriteMode','append','DelayTime',1);
end
close
end
winopen('windfield.gif')% 预览结果
复制代码
必要注意,以上使用了两个拓展工具箱,m_map(M_Map: A Mapping package for Matlab)和slandarer制作的slanCM颜色拓展包MATLAB | MATLAB配色不够用 全网最全的colormap补充包来啦_matlab color-CSDN博客,固然,各人也可以使用自己的colormap替换这个颜色拓展包,但是M_MAP是必须的。
最后是台风风场瞬时图
%% 提取1:12日每天0点的数据
index = hour(date) == 0& day(date) ~= 13;
date = date(index);
u = u(:,:,index);
v = v(:,:,index);
speed = speed(:,:,index);
%% 绘制台风风场图
% 分子图每幅图一个时刻
t = tiledlayout(3,4);
% 生成m_map project
m_proj('Equidistant Cylindrical','long',[110 160],'lat',[5 45]);
for i = 1:12
% 生成子图
nexttile(i);
hold on
% 绘制等高线图
contourf(X,Y,speed(:,:,i),15,'LineStyle','none')
caxis([0,32])% 颜色上下限
% 海岸线图
m_coast('patch',[.8 .8 .8]);
% m_gshhs_i('patch',[.8 .8 .8]);
% 绘制边框
m_grid('box','on','tickdir','in','backcolor',[1,1,1],'xtick',[],'ytick',[],'LineWidth',1.5);
hold off
% xlabel
XLB=xlabel(string(date(i)),'FontSize',15,'FontWeight','bold');
set(XLB,'Units','normalized','Position',[0.5,0],'HorizontalAlignment','center','VerticalAlignment','top')
end
% 设置间隙
t.Padding='none';
t.TileSpacing="none";
% 生成colorbar,实用Tiledlayout的设置
cb = colorbar;
cb.FontSize=14;
cb.Layout.Tile='east';
cb.Label.String='Wind speed (m/s)';
% 颜色设置
cr1 = flipud(slanCM(167));%彩色
cr2 = slanCM(25);%灰色
colormap([cr2(1:3:83,:);flipud(cr1(1:2:end-3,:))]);% 将低风速设置为灰色,突出高风速台风区域
% 输出图片设置
figWidth = 30; % 设置图片宽度
figHeight = 20; % 设置图片高度
set(gcf,'PaperUnits','centimeters'); % 图片尺寸所用单位
set(gcf,'PaperPosition',[0 0 figWidth figHeight]);
fileout = 'Windfield_Chan_hom'; % 输出图片的文件名
print(gcf,[fileout,'.tif'],'-r300','-dtiff'); % 设置图片格式、分辨率
winopen([fileout,'.tif'])
复制代码
同样使用了M_MAP的拓展包和slanCM的颜色拓展包
结尾
以上就是本次分享的全部内容了
如果觉得有用的话,
感谢您的点赞收藏和关注~
鼓励我继承更新吧!
接待评论区讨论
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4