利用Matlab繪制地圖的超詳細教程
worldmap和usamap是axesm的子類,worldmap是用于生成世界地圖坐標區(qū)域,usamap用于生成美國地圖坐標區(qū)域,本文先在worldmap函數基礎上講解如何導入各種數據繪制各種類型圖片,略提一下如何使用usamap,再講解axesm的各種屬性以滿足更多元化的地圖繪制需求,并在最后總結地圖繪制其他可用函數。
Mapping Toolbox工具箱安裝
請通過如下步驟安裝工具箱:
1.點擊附加功能:
2.搜索Mapping Toolbox,并點擊進入介紹界面:
3.點安裝一路點確定:
worldmap及usamap
首先是最簡單的海岸線世界地圖:
% 創(chuàng)建世界地圖坐標區(qū)域 worldmap('World') % 導入海岸線數據 load coastlines % 繪制海岸線 plotm(coastlat,coastlon)
附帶陸地區(qū)域、湖泊、河流、城市的世界地圖:
% 創(chuàng)建世界地圖坐標區(qū)域 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')
可以看到繪制的主要流程就是:
- 創(chuàng)建地圖坐標區(qū)域(通過axesm、worldmap、usamap)
- 導入數據(通過load或者shaperead)通過geoshow、plotm、scatterm
- 繪制圖像(大部分普通坐標區(qū)域axes中出現(xiàn)的函數加個m就變成了用于地圖坐標區(qū)域的函數)
worldmap創(chuàng)建地圖坐標區(qū)域部分:
大家肯定想知道worldmap()里面支持哪些參數,這個連官網都沒有寫,事實上只要無參數運行一下函數worldmap()就會蹦出來一個地區(qū)選擇框,大家可以試一下啊:
同時worldmap函數支持直接輸入經緯度范圍,例如:
latlim=[-50 50]; lonlim=[160 -30]; worldmap(latlim,lonlim)
數據導入部分:
其中可以通過load導入的MATLAB自帶數據有:
- coastlines - 世界海岸線經緯度矢量
- conus - 用于連接的美國(conus)、五大湖、州際邊界的經緯度陣列
- geoid60c - 全球大地水準面高度網格(以米為單位)/度
- greatlakes - 顯示結構陣列中的北美五大湖
- korea5c - 朝鮮半島的地形和水深測量
- koreaEQdata - 地震位置和震級
- layermtx - 用于教學的地理定位地形網格
- mapmtx - 用于教學的地理定位地形網格
- moonalb20c - 克萊門汀全球月球反照率圖
- moontopo60c - 月球的克萊門汀激光雷達地形
- oceanlo - 顯示結構數組中的海洋遮罩多邊形
- russia - 網格化土地、水域、邊界、外部區(qū)域
- seatempm -全球多通道海面溫度網格
- stars - 4500+顆恒星的天體坐標和星等
- usamtx - 美國各州的數據網格,每度五個單元格
- usgslulegend - USGS 土地利用類別列表
其中可以通過shaperead導入的MATLAB自帶數據有:
- landareas.shp - 全球陸地區(qū)域多邊形
- tsunamis.shp - 全球1950-2006 年中到大型海嘯的百分比
- usastatehi.shp - 高分辨率多邊形美國各州形狀
- usastatelo.shp - 低多邊形美國各州形狀
- worldcities.shp - 全球318個城市或人口稠密位置坐標
- worldlakes.shp - 世界上 37 個最大的多邊形湖泊和內陸海域
- worldrivers.shp - 世界主要河流的線條形狀
- boston_placenames.shp - 美國馬薩諸塞州波士頓地名
- boston_roads.shp - 美國馬薩諸塞州波士頓道路
- concord_hydro_area.shp - 美國馬薩諸塞州康科德水域
- concord_hydro_line.shp - 美國馬薩諸塞州康科德水路
- concord_roads.shp - 美國馬薩諸塞州康科德道路
這些信息來自:\mcr\toolbox\map\mapdata\Contents.m
局部區(qū)域陸地繪制
首先繪制個南極洲,南極洲的陸地信息可以從landareas.shp中提取 :
% 創(chuàng)建世界地圖坐標區(qū)域并將區(qū)域設置為南極洲 worldmap('antarctica') % 從陸地區(qū)域數據文件中獲取南極洲大陸數據并繪圖 antarctica = shaperead('landareas.shp', 'UseGeoCoords', true,... 'Selector',{@(name) strcmp(name,'Antarctica'), 'Name'}); patchm(antarctica.Lat, antarctica.Lon, [0.5 1 0.5])
除此之外其他面積較大,可以通過如上方式獲取的區(qū)域還有:
‘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’
例如我繪制中國附近的亞歐非大陸陸地:
% 創(chuàng)建世界地圖坐標區(qū)域并將區(qū)域設置為中國 worldmap('China') % 從陸地區(qū)域數據文件中獲取亞歐非大陸數據并繪圖 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 % 創(chuàng)建某經緯度范圍世界地圖坐標區(qū)域 latlim=[-50 50]; lonlim=[160 -30]; worldmap(latlim,lonlim) % 繪制圖像 geoshow(geoid60c,geoid60cR,'DisplayType','surface') geoshow(coastlat,coastlon,'Color','k')
要是覺得不好看,可以增添陸地區(qū)域和更改顏色,例如像下面這么做:
% 大地水準面高度數導入 load geoid60c.mat % 創(chuàng)建某經緯度范圍世界地圖坐標區(qū)域 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])
我們發(fā)現(xiàn)有些大地水準面高度比0要高,就會畫到板塊上面,同時顏色插值不夠密集,簡單處理一下:
% 大地水準面高度數導入 load geoid60c.mat % 創(chuàng)建某經緯度范圍世界地圖坐標區(qū)域 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
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)
axesm
創(chuàng)建一個robinson樣式,帶框的地圖坐標區(qū)域:
axesm('MapProjection','robinson','Frame','on')
創(chuàng)建好的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
展示一些網格設置:
% 某些視角下的地圖坐標區(qū) axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14])
MLineLimit是經線的緯度范圍,MLineException是不受經線長度范圍影響的經線,通過設置這兩個參數可以不讓所有經線都匯集到極地以顯的雜亂。
% 某些視角下的地圖坐標區(qū),經線的緯度范圍[-75 75] axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'MLineLimit',[-75 75])
% 某些視角下的地圖坐標區(qū),其他經線的緯度范圍[-75 75],四條經線繪制完全 axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'MLineLimit',[-75 75],... 'MLineException',[-90,0,90,180])
與之相對應的還有PLineLimit、PLineException
% 某些視角下的地圖坐標區(qū) axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'PLineLimit',[-75 75])
更多詳細信息可以去這里查看:The Map Grid - MATLAB & Simulink - MathWorks 中國
來個用axesm繪圖的實例:
% 某些視角下的地圖坐標區(qū),其他經線的緯度范圍[-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
首先值得一提的是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])
tightmap
取消圖像的白邊,非常好用
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
colormap
還可以設置其他自帶顏色
% 大地水準面高度數據及海岸線數據導入 load geoid60c.mat load coastlines subplot(1,2,1) % 創(chuàng)建某經緯度范圍世界地圖坐標區(qū)域 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) % 創(chuàng)建某經緯度范圍世界地圖坐標區(qū)域 latlim=[-50 50]; lonlim=[160 -30]; ax2=worldmap(latlim,lonlim); % 繪制圖像 geoshow(geoid60c,geoid60cR,'DisplayType','surface') colormap(ax2,pink) geoshow(coastlat,coastlon,'Color','k')
colorbar
% 導入數據并繪制貼圖版地圖 load korea5c worldmap(korea5c,korea5cR); geoshow(korea5c,korea5cR,'DisplayType','texturemap') % 修改顏色 demcmap(korea5c) % 添加顏色欄 colorbar
以上就是利用Matlab繪制地圖的超詳細教程的詳細內容,更多關于Matlab繪制地圖的資料請關注腳本之家其它相關文章!
相關文章
C語言?模擬實現(xiàn)memcpy與memmove函數詳解
這篇文章主要介紹了C語言詳解如何模擬內存函數,用到了mencpy與memmove兩個函數,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-04-04