見出し画像

MATLABでMAPを表示する~地図上に経路ログ表示~無料アプリでもOK!


地図を表示する

MATLAB は、標準で世界地図をいろいろな形式で表示できます

colorterrain / streets / topographic / satellite
streets-light / streets-dark / landcover / grayterrain
bluegreen / grayland / darkwater / none

以下に 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() を使います。

タブ切り替え表示
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');
実行結果

MATLAB Mobile で表示

標準機能ですので、無料スマホアプリの MATLAB Mobile でも使用できます!(タッチでタブ切り替え等のUI操作はできません)

MATLAB Mobile での実行結果(iPhone)

スマホのセンサーログを取る

また、MATLAB Mobile では GPS 等のセンサー情報ログも取れます

アカウント画面
センサー画面


無料アカウントを作れば、PCとの同期も
できます。

ログ保存に必要な MATLAB DRIVE は、ライセンスがあれば5GB、無料アカウントでは250MBの容量が付与されます。

有償ライセンスで 20 GB、無料で 5 GB に増えた模様!

2023/07/16

これはPCのWebブラウザからもアクセスできますし、MATLABライセンスがなくてもPC側に "MATLAB Drive Connector" をインストールすれば、PC上の仮想フォルダとしても使えます。

MATLAB Drive Connector (PC画面)

このセンサーデータは、直接PC上のMATLABへライブストリーミングすることもできますし、スマホにローカルログとして保存することもできます。

センサー > ストリーム先 画面

「自動アップロード」にしておけば、MATLAB DRIVE に自動的に同期されます。

センサー > センサーログ > 設定 画面

ここを「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スクリプト

実行結果(仮想データです)

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 "MATLAB Mobile" ~ フィルターの周波数特性を見る


ご興味持たれた方は、ぜひ遊んでみてください。(^-^)/


タイトル画像モデル:綾夏


この記事が気に入ったらサポートをしてみませんか?