![見出し画像](https://assets.st-note.com/production/uploads/images/71473472/rectangle_large_type_2_35897c6c9e97a110a1a97e9c4fe1767a.jpeg?width=800)
MATLABでMAPを表示する~地図上に経路ログ表示~無料アプリでもOK!
地図を表示する
MATLAB は、標準で世界地図をいろいろな形式で表示できます。
![](https://assets.st-note.com/img/1643904236078-LbAA0J8KG7.png?width=800)
![](https://assets.st-note.com/img/1643904545106-P6tP8JWzXX.png?width=800)
![](https://assets.st-note.com/img/1643904555846-Iz3s3SkkyZ.png?width=800)
以下に MATLAB スクリプトを示します。
Axes の子にはできないようなので、並べるために Panel に出しています。
figure
geolat = [41.7922 41.8010];
geolon = [140.7504 140.7629];
geoMap = 'colorterrain';
p1 = uipanel('Position',[0 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p1,'Basemap',geoMap);
geoMap = 'streets';
p2 = uipanel('Position',[0.5 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p2,'Basemap',geoMap);
geolimits(geolat, geolon)
geoMap = 'topographic';
p3 = uipanel('Position',[0 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p3,'Basemap',geoMap);
geoMap = 'satellite';
p4 = uipanel('Position',[0.5 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p4,'Basemap',geoMap);
geolimits(geolat, geolon)
figure
geoMap = 'streets-light';
p1 = uipanel('Position',[0 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p1,'Basemap',geoMap);
geoMap = 'streets-dark';
p2 = uipanel('Position',[0.5 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p2,'Basemap',geoMap);
geoMap = 'landcover';
p3 = uipanel('Position',[0 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p3,'Basemap',geoMap);
geoMap = 'grayterrain';
p4 = uipanel('Position',[0.5 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p4,'Basemap',geoMap);
figure
geoMap = 'bluegreen';
p1 = uipanel('Position',[0 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p1,'Basemap',geoMap);
geoMap = 'grayland';
p2 = uipanel('Position',[0.5 0.5 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p2,'Basemap',geoMap);
geoMap = 'darkwater';
p3 = uipanel('Position',[0 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p3,'Basemap',geoMap);
geoMap = 'none';
p4 = uipanel('Position',[0.5 0 .5 .5],'Title',geoMap,'FontSize',14);
geoaxes(p4,'Basemap',geoMap);
MATLAB スクリプト
タブ切り替え表示にしたい場合は uitab() を使います。
![](https://assets.st-note.com/production/uploads/images/71535374/picture_pc_e64e8f54f230d6556d0f96467d454ca6.gif?width=800)
f=figure;
tabgp = uitabgroup(f);
geoMap = 'colorterrain';
tab1 = uitab(tabgp,'Title',geoMap);
geoaxes(tab1,'Basemap',geoMap);
geoMap = 'streets';
tab2 = uitab(tabgp,'Title',geoMap);
geoaxes(tab2,'Basemap',geoMap);
geoMap = 'topographic';
tab3 = uitab(tabgp,'Title',geoMap);
geoaxes(tab3,'Basemap',geoMap);
geoMap = 'satellite';
tab4 = uitab(tabgp,'Title',geoMap);
geoaxes(tab4,'Basemap',geoMap);
MATLAB スクリプト
表示タブをスクリプトで切り替えるには、SelectedTab プロパティにタブのハンドルを代入します。
tabgp.SelectedTab = tab1;
変数を使いたい場合は、eval() を使うしかないかな?
tabN = sprintf("tab%d",n);
tabgp.SelectedTab = eval(tabN);
いや、ハンドルを配列にしといた方が良いですね。(^^;
tab(1) = uitab(tabgp,'Title',geoMap);
tab(2) = uitab(tabgp,'Title',geoMap);
tab(3) = uitab(tabgp,'Title',geoMap);
tab(4) = uitab(tabgp,'Title',geoMap);
tabgp.SelectedTab = tab(n);
一行のスクリプトで地図表示
一つの地図だけであれば、geoaxes() 一行で表示できます。
geoaxes('Basemap','streets');
![](https://assets.st-note.com/img/1643906260917-Ha8DNxKURb.png?width=800)
MATLAB Mobile で表示
標準機能ですので、無料スマホアプリの MATLAB Mobile でも使用できます!(タッチでタブ切り替え等のUI操作はできません)
![](https://assets.st-note.com/img/1643904812960-5UImMDQLu5.jpg?width=800)
スマホのセンサーログを取る
また、MATLAB Mobile では GPS 等のセンサー情報ログも取れます。
![](https://assets.st-note.com/img/1643907276420-EmtYaTWxD4.jpg?width=800)
![](https://assets.st-note.com/img/1643907324658-c53ia2zjEp.jpg?width=800)
無料アカウントを作れば、PCとの同期もできます。
ログ保存に必要な MATLAB DRIVE は、ライセンスがあれば5GB、無料アカウントでは250MBの容量が付与されます。
有償ライセンスで 20 GB、無料で 5 GB に増えた模様!
これはPCのWebブラウザからもアクセスできますし、MATLABライセンスがなくてもPC側に "MATLAB Drive Connector" をインストールすれば、PC上の仮想フォルダとしても使えます。
![](https://assets.st-note.com/img/1643909056251-wPSYcxEuET.png)
このセンサーデータは、直接PC上のMATLABへライブストリーミングすることもできますし、スマホにローカルログとして保存することもできます。
![](https://assets.st-note.com/img/1643907416118-Bbq4VnBn3R.jpg?width=800)
「自動アップロード」にしておけば、MATLAB DRIVE に自動的に同期されます。
![](https://assets.st-note.com/img/1643907454390-Qf8XQYVZQ9.jpg?width=800)
ここを「WiFi」にしておけば、Wi-Fiに接続されたときに同期されます。
指定できるサンプルレートは、0.5Hz(2秒間に1回)~100Hz(1秒間に100回)です。
ログデータ容量削減のため、もっと粗いのも指定できると良さそうなのですが。(¬_¬)
そのログファイルを load() で読み込めば、タイムテーブル変数 "Position" に、時刻、緯度、経度、高度、速度、進路、精度の各データが入ります。
load("/MATLAB Drive/MobileSensorData/sensorlog_XXXX_XXXX.mat")
Timestamp:時刻 ex. 01-2月-2022 01:40:45.000
latitude:赤道を基準とした緯度 (度単位) 正の値は北緯
longitude:基準子午線を基準とした経度 (度単位) 正の値は東経
altitude:海抜高度 (m)
speed:速度 (m/s)
course:真北を基準とした進路 (度)
hacc:経度と緯度を中心とする円によって定義される水平精度 (m)
詳しくは「MATLAB Mobile でのセンサー データの収集」を参照してください。
PCのMATLABであれば、ログファイルをダブルクリックすれば読み込まれます。
移動スピードも入っているので、ある速度以上の点のプロットや滞在時間表示なども簡単にできます。
時刻は "datatime" 形式のため、例えば
Position.Timestamp(end) - Position.Timestamp(1)
ans =
duration
00:12:24
とそのまま引けば経過時間が計算できます。
経路ログを表示する
経路ログを表示したければ、ログファイルをLoad後、例えば以下のようにします。
geoMap = 'streets';
gx = geoaxes('Basemap',geoMap);
latT = Position.latitude; lonT = Position.longitude;
geolimits(gx,[min(latT) max(latT)], [min(lonT) max(lonT)])
geolimits(gx,'manual')
hold(gx,'on')
geoplot(gx,latT(1),lonT(1),'g-*', 'LineWidth',2)
drawnow
for t=1:length(latT)-1
geoplot(gx,latT(t:t+1),lonT(t:t+1),'g-*', 'LineWidth',2)
drawnow
end
hold(gx,'off')
MATLABスクリプト
![](https://assets.st-note.com/production/uploads/images/71473660/picture_pc_2d1df0e6bf96797401369d37061e6bc9.gif)
PCのMALTABライブスクリプトであれば、結果を上のようなGIF/mp4にエクスポートするのも一発なのですが、MATLAB Mobile でやりたい場合は以下のように、imwrite() を使って各フレームを動画の1フレームとしてファイル保存します。
filename = 'ShowaKinenPark.gif';
we = true;
geoMap = 'streets';
gx = geoaxes('Basemap',geoMap);
% latT = Position.latitude; lonT = Position.longitude;
geolimits(gx,[min(latT) max(latT)], [min(lonT) max(lonT)])
geolimits(gx,'manual')
hold(gx,'on')
geoplot(gx,latT(1),lonT(1),'g-*', 'LineWidth',2)
drawnow
if we
frame = getframe(gca); % take image only
gr = frame2im(frame);
[bA,map] = rgb2ind(gr,256);
imwrite(bA,map,filename,'gif','LoopCount',Inf,'DelayTime',1/15);
end
for t=1:length(latT)-1
geoplot(gx,latT(t:t+1),lonT(t:t+1),'g-*', 'LineWidth',2)
drawnow
if we
frame = getframe(gca); % take image only
gr = frame2im(frame);
[bA,map] = rgb2ind(gr,256);
imwrite(bA,map,filename,'gif','WriteMode','append','DelayTime',1/15);
end
end
hold(gx,'off')
'ShowaKinenPark.gif' というファイルが MATLAB Drive上にできますので、PCからアクセスしてください。直接スマホの写真フォルダー等にはコピーできないようです。
それとなぜか、ライブスクリプトの方が地図表示が安定しているようです。
PC版MATLABがあれば MATLAB Drive 経由で送れば良いのですが、ない場合はテキストか.mファイル(中身はテキスト)で送り、 Mobile 側でライブスクリプトを新規作成してコピペするしかありません。
ライブスクリプトの新規作成は、iPad版の MATLAB Mobile では 「ファイル」画面の+で、iPhone版では コマンドラインで edit ファイル名.mlx とします。
逆に地図上のデータが欲しい場合は、ginput() を用います。
ただしこれは Mobileではできないので、有料のPC版MATLABが必要です。
[latT,lonT] = ginput(N); % N:データ数
とすれば、地図上でクリックした点の緯度経度データ列が得られます。
上の「仮想データ」は、ginput() で作成しました。
いかがでしたでしょうか?
無料アプリでこういったことが簡単にできてしまいます。
実は私も少し前まで、別途 toolbox が必要なのかと思っていました。(^^;
MATLAB Mobile に関しては、こちらの記事でも紹介しています。
無料で始めるMATLAB ~ スマホでMATLAB "MATLAB Mobile" ~ フィルターの周波数特性を見る
ご興味持たれた方は、ぜひ遊んでみてください。(^-^)/
タイトル画像モデル:綾夏
この記事が気に入ったらサポートをしてみませんか?