利用Matlab繪制地圖的超詳細(xì)教程
worldmap和usamap是axesm的子類,worldmap是用于生成世界地圖坐標(biāo)區(qū)域,usamap用于生成美國地圖坐標(biāo)區(qū)域,本文先在worldmap函數(shù)基礎(chǔ)上講解如何導(dǎo)入各種數(shù)據(jù)繪制各種類型圖片,略提一下如何使用usamap,再講解axesm的各種屬性以滿足更多元化的地圖繪制需求,并在最后總結(jié)地圖繪制其他可用函數(shù)。
Mapping Toolbox工具箱安裝
請通過如下步驟安裝工具箱:
1.點(diǎn)擊附加功能:
2.搜索Mapping Toolbox,并點(diǎn)擊進(jìn)入介紹界面:
3.點(diǎn)安裝一路點(diǎn)確定:
worldmap及usamap
首先是最簡單的海岸線世界地圖:
% 創(chuàng)建世界地圖坐標(biāo)區(qū)域 worldmap('World') % 導(dǎo)入海岸線數(shù)據(jù) load coastlines % 繪制海岸線 plotm(coastlat,coastlon)
附帶陸地區(qū)域、湖泊、河流、城市的世界地圖:
% 創(chuàng)建世界地圖坐標(biāo)區(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)建地圖坐標(biāo)區(qū)域(通過axesm、worldmap、usamap)
- 導(dǎo)入數(shù)據(jù)(通過load或者shaperead)通過geoshow、plotm、scatterm
- 繪制圖像(大部分普通坐標(biāo)區(qū)域axes中出現(xiàn)的函數(shù)加個(gè)m就變成了用于地圖坐標(biāo)區(qū)域的函數(shù))
worldmap創(chuàng)建地圖坐標(biāo)區(qū)域部分:
大家肯定想知道worldmap()里面支持哪些參數(shù),這個(gè)連官網(wǎng)都沒有寫,事實(shí)上只要無參數(shù)運(yùn)行一下函數(shù)worldmap()就會(huì)蹦出來一個(gè)地區(qū)選擇框,大家可以試一下?。?/p>
同時(shí)worldmap函數(shù)支持直接輸入經(jīng)緯度范圍,例如:
latlim=[-50 50]; lonlim=[160 -30]; worldmap(latlim,lonlim)
數(shù)據(jù)導(dǎo)入部分:
其中可以通過load導(dǎo)入的MATLAB自帶數(shù)據(jù)有:
- coastlines - 世界海岸線經(jīng)緯度矢量
- conus - 用于連接的美國(conus)、五大湖、州際邊界的經(jīng)緯度陣列
- geoid60c - 全球大地水準(zhǔn)面高度網(wǎng)格(以米為單位)/度
- greatlakes - 顯示結(jié)構(gòu)陣列中的北美五大湖
- korea5c - 朝鮮半島的地形和水深測量
- koreaEQdata - 地震位置和震級
- layermtx - 用于教學(xué)的地理定位地形網(wǎng)格
- mapmtx - 用于教學(xué)的地理定位地形網(wǎng)格
- moonalb20c - 克萊門汀全球月球反照率圖
- moontopo60c - 月球的克萊門汀激光雷達(dá)地形
- oceanlo - 顯示結(jié)構(gòu)數(shù)組中的海洋遮罩多邊形
- russia - 網(wǎng)格化土地、水域、邊界、外部區(qū)域
- seatempm -全球多通道海面溫度網(wǎng)格
- stars - 4500+顆恒星的天體坐標(biāo)和星等
- usamtx - 美國各州的數(shù)據(jù)網(wǎng)格,每度五個(gè)單元格
- usgslulegend - USGS 土地利用類別列表
其中可以通過shaperead導(dǎo)入的MATLAB自帶數(shù)據(jù)有:
- landareas.shp - 全球陸地區(qū)域多邊形
- tsunamis.shp - 全球1950-2006 年中到大型海嘯的百分比
- usastatehi.shp - 高分辨率多邊形美國各州形狀
- usastatelo.shp - 低多邊形美國各州形狀
- worldcities.shp - 全球318個(gè)城市或人口稠密位置坐標(biāo)
- worldlakes.shp - 世界上 37 個(gè)最大的多邊形湖泊和內(nèi)陸海域
- 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ū)域陸地繪制
首先繪制個(gè)南極洲,南極洲的陸地信息可以從landareas.shp中提取 :
% 創(chuàng)建世界地圖坐標(biāo)區(qū)域并將區(qū)域設(shè)置為南極洲 worldmap('antarctica') % 從陸地區(qū)域數(shù)據(jù)文件中獲取南極洲大陸數(shù)據(jù)并繪圖 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)建世界地圖坐標(biāo)區(qū)域并將區(qū)域設(shè)置為中國 worldmap('China') % 從陸地區(qū)域數(shù)據(jù)文件中獲取亞歐非大陸數(shù)據(jù)并繪圖 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]) % 加個(gè)海岸線美化一下 load coastlines plotm(coastlat,coastlon)
映射貼圖
南美洲和中太平洋的大地水準(zhǔn)面高度:
要繪制高度映射圖只需要將geoshow的’DisplayType’屬性設(shè)置為’surface’。
注意,官網(wǎng)的寫法,[geoid60c,geoid60cR] = egm96geoid 2020a已經(jīng)被移除,如果是之后的版本,請不要按照官網(wǎng)而是按照如下寫法進(jìn)行書寫。
% 大地水準(zhǔn)面高度數(shù)據(jù)及海岸線數(shù)據(jù)導(dǎo)入 load geoid60c.mat load coastlines % 創(chuàng)建某經(jīng)緯度范圍世界地圖坐標(biāo)區(qū)域 latlim=[-50 50]; lonlim=[160 -30]; worldmap(latlim,lonlim) % 繪制圖像 geoshow(geoid60c,geoid60cR,'DisplayType','surface') geoshow(coastlat,coastlon,'Color','k')
要是覺得不好看,可以增添陸地區(qū)域和更改顏色,例如像下面這么做:
% 大地水準(zhǔn)面高度數(shù)導(dǎo)入 load geoid60c.mat % 創(chuàng)建某經(jīng)緯度范圍世界地圖坐標(biāo)區(qū)域 latlim=[-50 50]; lonlim=[160 -30]; ax=worldmap(latlim,lonlim); % 設(shè)置顏色 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) % 應(yīng)用顏色 land=shaperead('landareas.shp','UseGeoCoords',true); geoshow(ax,land,'FaceColor',[0.5 0.7 0.5])
我們發(fā)現(xiàn)有些大地水準(zhǔn)面高度比0要高,就會(huì)畫到板塊上面,同時(shí)顏色插值不夠密集,簡單處理一下:
% 大地水準(zhǔn)面高度數(shù)導(dǎo)入 load geoid60c.mat % 創(chuàng)建某經(jīng)緯度范圍世界地圖坐標(biāo)區(qū)域 latlim=[-50 50]; lonlim=[160 -30]; ax=worldmap(latlim,lonlim); % 設(shè)置顏色并插值細(xì)化 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')'; % 下面減了個(gè)100為了讓最大值也小于0 geoshow(ax,geoid60c-100,geoid60cR,'DisplayType','surface') colormap(C1) % 應(yīng)用顏色 land=shaperead('landareas.shp','UseGeoCoords',true); geoshow(ax,land,'FaceColor',[0.5 0.7 0.5])
紋理貼圖
朝鮮半島為例:
要繪制顏色映射圖只需要將geoshow的’DisplayType’屬性設(shè)置為’texturemap’。
% 導(dǎo)入數(shù)據(jù)并繪制貼圖版地圖 load korea5c worldmap(korea5c,korea5cR); geoshow(korea5c,korea5cR,'DisplayType','texturemap') % 修改顏色 demcmap(korea5c)
這個(gè)demcmap是一個(gè)可以描述為一個(gè)需要同時(shí)設(shè)置海洋色帶和陸地色帶的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)
顏色可能不是太好看哈,下面給個(gè)我自己弄的配色:
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);
各種路徑一共有六類,不但可以為不同設(shè)置線性,還可以設(shè)置顏色,粗細(xì)等各種信息:
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); % 倆州離太遠(yuǎn)畫不開,不要 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)
再換個(gè)顏色叭
usamap("conus"); states=shaperead("usastatelo.shp",'UseGeoCoords',true); % 倆州離太遠(yuǎn)畫不開,不要 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)建一個(gè)robinson樣式,帶框的地圖坐標(biāo)區(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
展示一些網(wǎng)格設(shè)置:
% 某些視角下的地圖坐標(biāo)區(qū) axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14])
MLineLimit是經(jīng)線的緯度范圍,MLineException是不受經(jīng)線長度范圍影響的經(jīng)線,通過設(shè)置這兩個(gè)參數(shù)可以不讓所有經(jīng)線都匯集到極地以顯的雜亂。
% 某些視角下的地圖坐標(biāo)區(qū),經(jīng)線的緯度范圍[-75 75] axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'MLineLimit',[-75 75])
% 某些視角下的地圖坐標(biāo)區(qū),其他經(jīng)線的緯度范圍[-75 75],四條經(jīng)線繪制完全 axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'MLineLimit',[-75 75],... 'MLineException',[-90,0,90,180])
與之相對應(yīng)的還有PLineLimit、PLineException
% 某些視角下的地圖坐標(biāo)區(qū) axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'PLineLimit',[-75 75])
更多詳細(xì)信息可以去這里查看:The Map Grid - MATLAB & Simulink - MathWorks 中國
來個(gè)用axesm繪圖的實(shí)例:
% 某些視角下的地圖坐標(biāo)區(qū),其他經(jīng)線的緯度范圍[-75 75],四條經(jīng)線繪制完全 axesm('MapProjection','ortho','Frame','on',... 'grid','on','Origin',[40,40,14],... 'MLineLimit',[-75 75],... 'MLineException',[-90,0,90,180]) % 導(dǎo)入海岸線數(shù)據(jù) load coastlines % 繪制海岸線 plotm(coastlat,coastlon)
一些地圖繪制可用簡易函數(shù)
subplot
首先值得一提的是subplot函數(shù)依舊適用:
例如:
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
邊框標(biāo)簽網(wǎng)格快速開關(guān)函數(shù)
邊框,網(wǎng)格,經(jīng)線標(biāo)簽,緯線標(biāo)簽快速設(shè)置,類似hold on\grid on:
framem on gridm on mlabel on plabel on % framem off gridm off mlabel offf plabel off
colormap
還可以設(shè)置其他自帶顏色
% 大地水準(zhǔn)面高度數(shù)據(jù)及海岸線數(shù)據(jù)導(dǎo)入 load geoid60c.mat load coastlines subplot(1,2,1) % 創(chuàng)建某經(jīng)緯度范圍世界地圖坐標(biāo)區(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)建某經(jīng)緯度范圍世界地圖坐標(biāo)區(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
% 導(dǎo)入數(shù)據(jù)并繪制貼圖版地圖 load korea5c worldmap(korea5c,korea5cR); geoshow(korea5c,korea5cR,'DisplayType','texturemap') % 修改顏色 demcmap(korea5c) % 添加顏色欄 colorbar
以上就是利用Matlab繪制地圖的超詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Matlab繪制地圖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)簡單版圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單版圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++探索構(gòu)造函數(shù)私有化會(huì)產(chǎn)生什么結(jié)果
C++的構(gòu)造函數(shù)的作?:初始化類對象的數(shù)據(jù)成員。即類的對象被創(chuàng)建的時(shí)候,編譯系統(tǒng)對該對象分配內(nèi)存空間,并?動(dòng)調(diào)?構(gòu)造函數(shù),完成類成員的初始化。構(gòu)造函數(shù)的特點(diǎn):以類名作為函數(shù)名,?返回類型2022-05-05C語言?模擬實(shí)現(xiàn)memcpy與memmove函數(shù)詳解
這篇文章主要介紹了C語言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個(gè)函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-04-04