worldmap和usamap是axesm的子类,worldmap是用于生成世界地图坐标区域,usamap用于生成美国地图坐标区域,本文先在worldmap函数基础上讲解如何导入各种数据绘制各种类型图片,略提一下如何使用usamap,再讲解axesm的各种属性以满足更多元化的地图绘制需求,并在最后总结地图绘制其他可用函数。
请通过如下步骤安装工具箱:
worldmap及usamap
首先是最简单的海岸线世界地图:
% 创建世界地图坐标区域
worldmap('World')
% 导入海岸线数据
load coastlines
% 绘制海岸线
plotm(coastlat,coastlon)
% 创建世界地图坐标区域
ax=worldmap('World');
setm(ax,'Origin',[0 180 0])
% 绘制陆地
land=shaperead('landareas.shp','UseGeoCoords',true);
geoshow(ax,land,'FaceColor',[0.5 0.7 0.5])
% 绘制湖泊
lakes=shaperead('worldlakes.shp','UseGeoCoords',true);
geoshow(lakes,'FaceColor','blue')
% 绘制河流
rivers=shaperead('worldrivers.shp','UseGeoCoords',true);
geoshow(rivers, 'Color', 'blue')
% 绘制城市
cities=shaperead('worldcities.shp','UseGeoCoords',true);
geoshow(cities,'Marker','.','Color','red')
可以看到绘制的主要流程就是:
worldmap创建地图坐标区域部分:
大家肯定想知道worldmap()里面支持哪些参数,这个连官网都没有写,事实上只要无参数运行一下函数worldmap()就会蹦出来一个地区选择框,大家可以试一下啊:
同时worldmap函数支持直接输入经纬度范围,例如:
latlim=[-50 50];
lonlim=[160 -30];
worldmap(latlim,lonlim)
数据导入部分:
其中可以通过load导入的MATLAB自带数据有:
其中可以通过shaperead导入的MATLAB自带数据有:
\mcr\toolbox\map\mapdata\Contents.m
首先绘制个南极洲,南极洲的陆地信息可以从landareas.shp中提取 :
% 创建世界地图坐标区域并将区域设置为南极洲
worldmap('antarctica')
% 从陆地区域数据文件中获取南极洲大陆数据并绘图
antarctica = shaperead('landareas.shp', 'UseGeoCoords', true,...
'Selector',{@(name) strcmp(name,'Antarctica'), 'Name'});
patchm(antarctica.Lat, antarctica.Lon, [0.5 1 0.5])
除此之外其他面积较大,可以通过如上方式获取的区域还有:
‘Antarctica’‘Africa and Eurasia’‘North and South America’‘Greenland’‘Australia’‘Baffin Island’‘Ellesmere Island’‘New Guinea’‘Great Britain’‘Borneo’‘Honshu’‘Victoria Island’‘Celebes’‘New Zealand North Island’‘Sumatra’‘Madagascar’‘Iceland’‘New Zealand South Island’‘Newfoundland’‘Luzon’‘Devon Island’‘Ireland’‘Cuba’‘Java’‘Mindanao’
例如我绘制中国附近的亚欧非大陆陆地:
% 创建世界地图坐标区域并将区域设置为中国
worldmap('China')
% 从陆地区域数据文件中获取亚欧非大陆数据并绘图
antarctica = shaperead('landareas.shp', 'UseGeoCoords', true,...
'Selector',{@(name) strcmp(name,'Africa and Eurasia'), 'Name'});
patchm(antarctica.Lat, antarctica.Lon, [0.5 0.7 0.5])
% 加个海岸线美化一下
load coastlines
plotm(coastlat,coastlon)
南美洲和中太平洋的大地水准面高度:
要绘制高度映射图只需要将geoshow的’DisplayType’属性设置为’surface’。
注意,官网的写法,[geoid60c,geoid60cR] = egm96geoid 2020a已经被移除,如果是之后的版本,请不要按照官网而是按照如下写法进行书写。
% 大地水准面高度数据及海岸线数据导入
load geoid60c.mat
load coastlines
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
worldmap(latlim,lonlim)
% 绘制图像
geoshow(geoid60c,geoid60cR,'DisplayType','surface')
geoshow(coastlat,coastlon,'Color','k')
要是觉得不好看,可以增添陆地区域和更改颜色,例如像下面这么做:
% 大地水准面高度数导入
load geoid60c.mat
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax=worldmap(latlim,lonlim);
% 设置颜色
C=[222,238,209;126,190,174;144,213,220;
33,118,155;30,69,128;20,49,127]./255;
geoshow(ax,geoid60c,geoid60cR,'DisplayType','surface')
colormap(C) % 应用颜色
land=shaperead('landareas.shp','UseGeoCoords',true);
geoshow(ax,land,'FaceColor',[0.5 0.7 0.5])
我们发现有些大地水准面高度比0要高,就会画到板块上面,同时颜色插值不够密集,简单处理一下:
% 大地水准面高度数导入
load geoid60c.mat
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax=worldmap(latlim,lonlim);
% 设置颜色并插值细化
C=[222,238,209;126,190,174;144,213,220;
33,118,155;30,69,128;20,49,127]./255;
C1(:,1)=interp1(0:5,C(:,1),0:.5:5,'linear')';
C1(:,2)=interp1(0:5,C(:,2),0:.5:5,'linear')';
C1(:,3)=interp1(0:5,C(:,3),0:.5:5,'linear')';
% 下面减了个100为了让最大值也小于0
geoshow(ax,geoid60c-100,geoid60cR,'DisplayType','surface')
colormap(C1) % 应用颜色
land=shaperead('landareas.shp','UseGeoCoords',true);
geoshow(ax,land,'FaceColor',[0.5 0.7 0.5])
朝鲜半岛为例:
要绘制颜色映射图只需要将geoshow的’DisplayType’属性设置为’texturemap’。
% 导入数据并绘制贴图版地图
load korea5c
worldmap(korea5c,korea5cR);
geoshow(korea5c,korea5cR,'DisplayType','texturemap')
% 修改颜色
demcmap(korea5c)
这个demcmap是一个可以描述为一个需要同时设置海洋色带和陆地色带的colormap,下面是MATHWORKS自带的例子:
load korea5c
worldmap(korea5c,korea5cR);
geoshow(korea5c,korea5cR,'DisplayType','texturemap')
cmapsea=[.8 0 .8; 0 0 .8];
cmapland=[.7 0 0; .8 .8 0; 1 1 .8];
demcmap(korea5c,32,cmapsea,cmapland)
颜色可能不是太好看哈,下面给个我自己弄的配色:
load korea5c
worldmap(korea5c,korea5cR);
geoshow(korea5c,korea5cR,'DisplayType','texturemap')
cmapsea=[20,49,127;30,69,128;33,118,155;144,213,220]./255;
cmapland=[10,133,102;197,226,102]./255;
demcmap(korea5c,32,cmapsea,cmapland)
以美国马萨诸塞州康科德道路道路为例
roads=shaperead('concord_roads.shp');
lineStyle = makesymbolspec('Line',...
{'CLASS',[1 3], 'LineStyle',':'},...
{'CLASS',[4 6],'LineStyle','-.'});
mapshow(roads,'SymbolSpec',lineStyle);
各种路径一共有六类,不但可以为不同设置线性,还可以设置颜色,粗细等各种信息:
roads=shaperead('concord_roads.shp');
lineStyle=makesymbolspec("Line", ...
{'CLASS',2,'Color','#A2142F'}, ...
{'CLASS',3,'Color','#77AC30'}, ...
{'CLASS',6,'Color','#0072BD'}, ...
{'Default','Color','k'});
mapshow(roads,'SymbolSpec',lineStyle);
roads=shaperead('concord_roads.shp');
lineStyle=makesymbolspec("Line", ...
{'CLASS',[1 3],'LineStyle',':','LineWidth',2}, ...
{'CLASS',[4 6],'LineStyle','-.','LineWidth',0.25});
mapshow(roads,'SymbolSpec',lineStyle);
usamap("conus");
states=shaperead("usastatelo.shp",'UseGeoCoords',true);
% 俩州离太远画不开,不要
for i=length(states):-1:1
if states(i).Name=="Alaska"||states(i).Name=="Hawaii"
states(i)=[];
end
end
faceColors=makesymbolspec('Polygon',{'INDEX',[1 numel(states)],'FaceColor',...
polcmap(numel(states))});
geoshow(states, 'DisplayType','polygon','SymbolSpec', faceColors)
再换个颜色叭
usamap("conus");
states=shaperead("usastatelo.shp",'UseGeoCoords',true);
% 俩州离太远画不开,不要
for i=length(states):-1:1
if states(i).Name=="Alaska"||states(i).Name=="Hawaii"
states(i)=[];
end
end
% 插值定义颜色
C=[222,238,209;126,190,174;144,213,220;
33,118,155;30,69,128;20,49,127]./255;
C1(:,1)=interp1(0:5,C(:,1),linspace(0,5,numel(states)),'linear')';
C1(:,2)=interp1(0:5,C(:,2),linspace(0,5,numel(states)),'linear')';
C1(:,3)=interp1(0:5,C(:,3),linspace(0,5,numel(states)),'linear')';
faceColors=makesymbolspec('Polygon',{'INDEX',[1 numel(states)],'FaceColor',C1});
geoshow(states, 'DisplayType','polygon','SymbolSpec', faceColors)
创建一个robinson样式,带框的地图坐标区域:
axesm('MapProjection','robinson','Frame','on')
创建好的axesm可以通过setm修改样式:
axesm('MapProjection','robinson','Frame','on')
setm(gca,'FLineWidth',3,'Grid','on')
展示一下所有类型的地图:
mapType={'balthsrt', 'behrmann', 'bsam', 'braun', 'cassinistd', 'cassini', 'ccylin', 'eqacylin', 'eqdcylin', 'giso', 'gortho', 'gstereo', 'lambcyln',...
'mercator', 'miller', 'pcarree', 'tranmerc', 'trystan', 'utm', 'wetch', 'apianus', 'collig', 'craster', 'eckert1', 'eckert2', 'eckert3', 'eckert4',...
'eckert5', 'eckert6', 'flatplrp', 'flatplrq', 'flatplrs', 'fournier', 'goode', 'hatano', 'kavrsky5', 'kavrsky6', 'loximuth', 'modsine', 'mollweid',...
'putnins5', 'quartic', 'robinson', 'sinusoid', 'wagner4', 'winkel', 'eqaconicstd', 'eqaconic', 'eqdconicstd', 'eqdconic', 'lambertstd', 'lambert',...
'murdoch1', 'murdoch3', 'polyconstd', 'polycon', 'vgrint1', 'bonne', 'werner', 'breusing', 'eqaazim', 'eqdazim', 'globe', 'gnomonic', 'ortho',...
'stereo', 'ups', 'vperspec', 'wiechel', 'aitoff', 'bries', 'hammer'};
for i=1:72
subplot(9,8,i)
axesm('MapProjection',mapType{i},'Frame','on','FLineWidth',3,'Grid','on')
tightmap
end
展示一些网格设置:
% 某些视角下的地图坐标区
axesm('MapProjection','ortho','Frame','on',...
'grid','on','Origin',[40,40,14])
MLineLimit是经线的纬度范围,MLineException是不受经线长度范围影响的经线,通过设置这两个参数可以不让所有经线都汇集到极地以显的杂乱。
% 某些视角下的地图坐标区,经线的纬度范围[-75 75]
axesm('MapProjection','ortho','Frame','on',...
'grid','on','Origin',[40,40,14],...
'MLineLimit',[-75 75])
% 某些视角下的地图坐标区,其他经线的纬度范围[-75 75],四条经线绘制完全
axesm('MapProjection','ortho','Frame','on',...
'grid','on','Origin',[40,40,14],...
'MLineLimit',[-75 75],...
'MLineException',[-90,0,90,180])
与之相对应的还有PLineLimit、PLineException
% 某些视角下的地图坐标区
axesm('MapProjection','ortho','Frame','on',...
'grid','on','Origin',[40,40,14],...
'PLineLimit',[-75 75])
更多详细信息可以去这里查看:The Map Grid - MATLAB & Simulink - MathWorks 中国
来个用axesm绘图的实例:
% 某些视角下的地图坐标区,其他经线的纬度范围[-75 75],四条经线绘制完全
axesm('MapProjection','ortho','Frame','on',...
'grid','on','Origin',[40,40,14],...
'MLineLimit',[-75 75],...
'MLineException',[-90,0,90,180])
% 导入海岸线数据
load coastlines
% 绘制海岸线
plotm(coastlat,coastlon)
首先值得一提的是subplot函数依旧适用:
例如:
load korea5c
subplot(1,2,1)
worldmap('China')
antarctica = shaperead('landareas.shp', 'UseGeoCoords', true,...
'Selector',{@(name) strcmp(name,'Africa and Eurasia'), 'Name'});
patchm(antarctica.Lat, antarctica.Lon, [0.5 0.7 0.5])
subplot(1,2,2)
worldmap('Europe')
antarctica = shaperead('landareas.shp', 'UseGeoCoords', true,...
'Selector',{@(name) strcmp(name,'Africa and Eurasia'), 'Name'});
patchm(antarctica.Lat, antarctica.Lon, [0.5 0.7 0.5])
取消图像的白边,非常好用
subplot(1,2,1)
axesm('MapProjection','robinson','Frame','on','Grid','on')
subplot(1,2,2)
axesm('MapProjection','robinson','Frame','on','Grid','on')
tightmap
边框,网格,经线标签,纬线标签快速设置,类似hold on\grid on:
framem on
gridm on
mlabel on
plabel on
%
framem off
gridm off
mlabel offf
plabel off
还可以设置其他自带颜色
% 大地水准面高度数据及海岸线数据导入
load geoid60c.mat
load coastlines
subplot(1,2,1)
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax1=worldmap(latlim,lonlim);
% 绘制图像
geoshow(geoid60c,geoid60cR,'DisplayType','surface')
colormap(ax1,summer)
geoshow(coastlat,coastlon,'Color','k')
subplot(1,2,2)
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax2=worldmap(latlim,lonlim);
% 绘制图像
geoshow(geoid60c,geoid60cR,'DisplayType','surface')
colormap(ax2,pink)
geoshow(coastlat,coastlon,'Color','k')
% 导入数据并绘制贴图版地图
load korea5c
worldmap(korea5c,korea5cR);
geoshow(korea5c,korea5cR,'DisplayType','texturemap')
% 修改颜色
demcmap(korea5c)
% 添加颜色栏
colorbar