Matlab利用M_map和mapshow绘制网格地图
最近在做利用网格数据绘制’Lambert‘投影的地图,之前没有系统的利用matlab做过相关的工作,花了几天时间,问了专业的同学,最终整理了两种画图的方法。
1、M_map工具箱画图
首先,系统里要安装有m_map的工具箱。我下载的是1.4b版本的,具体下载方法百度可以搜索到。
(1)下载相关网址https://www.eoas.ubc.ca/~rich/map.html
(2)下载好需要把工具箱解压移动到自己安装matlab的’toolbox’里。
安装位置:
(3)代码记录
// An highlighted block
var foo = 'bar';
%% 画图
lat_lon=csvread('D:\学习资料\处理数据\lat_londata.csv');
lat=lat_lon(:,1);
lon=lat_lon(:,2);
lat=reshape(lat,122,252);
lon=reshape(lon,122,252);%这一步处理是因为我数据里面的经纬度是两列数据,需要将经纬度处理成二维数组
%% 设置投影,坐标系网格等等...
m_proj('Lambert','longitudes',[-75 -6],'latitudes',[58 85]);
m_grid('xlim',[-70,-10],'xtick',-70:10:-10,'ylim',[60,80],'ytick',60:10:80,...
'linewidth',1,'tickdir','in','box','fancy',...
'fontsize',10,'fontweight','bold');hold on;%
GL=shaperead('D:\学习资料\格陵兰岛\greenland\greenland.shp','UseGeoCoords',true);
%% 绘制shp文件(plot是面,patch是线)
boux=[GL(:).Lon];bouy=[GL(:).Lat];
m_plot(boux,bouy,'color',[0.85,0.85,0.85],'Linewidth',0.1);
m_patch(boux,bouy,[0.85,0.85,0.85]);%'yellow''k-'%这两句代码是mapshow的功能
hold on
%% 填色环节,注意A数据是我自己需要使用的栅格数据,和Lon以及lat是对应关系
m_pcolor(lon,lat,A);
hold on;
(4)注意点
m_map是工具箱,因此使用的时候注意使用到的函数都是‘m_’开头的,例如填色的时候千万不能使用pcolor,而使用worldmap画框的画,则用pcolorm填色。其他的函数暂时还没注意到。
数据边框没处理好是我自己数据的问题,下面的shp文件画出来被填色遮挡住了,此外,这是格陵兰岛0.25度网格绘制的结果
2、geoshow-worldmap画图
这个是matlab自带的功能,也需要和上文的工具箱的函数完全分开!!
这里也是分了两种画图的方法
不说了,直接上代码=v=
方法一:先创建坐标轴。坐标轴的参数可以参照下面链接
(1)https://zhuanlan.zhihu.com/p/526463769
(2)https://ww2.mathworks.cn/help/map/ref/axesm-properties.html 官方帮助文档
// An highlighted block
ax1=axesm('MapProjection','Lambert','MapLatLimit',[58 85],'MapLonLimit',[-75 -10],...
'Frame','on','flinewidth',2,'Grid','on', 'FontName', 'Times', 'FontSize', 10,...
'MLineLocation',10,'PLineLocation',10,'ParallelLabel','on','MeridianLabel','on');%创建坐标轴
setm(gca,'flinewidth',2,'Grid','on', 'GLineWidth', 1,'FontName','times new roman','Frame','on');%修改轴的属性,看了帮助文档就可以知道,其实这句代码里面的参数完全可以合并到上一句axesm里面了哈哈,只不过自己学习,写着看看效果。“注意,定义好坐标轴也就不需要再用worldmap打开一个范围内的坐标轴了,就是这两段函数和wordlmap是两种方法,选择一种即可”
GL=shaperead('D:\学习资料\格陵兰岛\greenland\greenland.shp','UseGeoCoords',true);
geoshow(GL,'facecolor',[0.85,0.85,0.85],'Edgecolor',[0.85,0.85,0.85]);%这里
axis off;%不加这段代码的话,图就太丑了,轴的刻度线就超过了画图范围
hold on
lat_lon=csvread('D:\学习资料\处理数据\lat_londata.csv');
lat=lat_lon(:,1);
lon=lat_lon(:,2);
lat=reshape(lat,122,252);
lon=reshape(lon,122,252);
t=geoshow(lat,lon,A,'DisplayType','texturemap');
set(t,'FaceAlpha','texturemap','AlphaData',double(~isnan(A)));
hold on
3、geoshow的第二种画图方法
其实呈现的结果都是一样的,只不过是geoshow函数的形式不同
// An highlighted block
refvec=[4 89.625 -73.125];%286.875
t=geoshow(gca,A,refvec,'displaytype','texturemap');
set(t,'FaceAlpha','texturemap','AlphaData',double(~isnan(A)));
hold on
refvec只是定义了一个画图的范围,具体表示含义如下
4、画图中的注意点
(1)我使用的格网数据里包括了NaN值,在m_map里函数自动不填色,但是在geoshow里面会填上其他的颜色,影响作图效果,经过查阅资料,这句代码可以完美解决,但是具体的参数含义目前没有搞明白,其他解决方案可见https://ww2.mathworks.cn/matlabcentral/answers/253209-hide-nans-in-geoshow
// An highlighted block
set(t,'FaceAlpha','texturemap','AlphaData',double(~isnan(A)));
(2)利用geoshow画图的时候,试图修改经纬度轴线为黑白相交的线,查了一上午完全没发现解决办法,所以对于我画图的结果m_map和geoshow的唯一画图的区别也就是这里吧= =.如果有知道怎么解决的,请私信或者评论区教教我,不胜感激