Main Content

从您的移动设备获取 GPS 数据,并在地图上绘制您的位置和速度

此示例说明如何从 Android™ 或 iOS 移动设备收集位置数据并将其显示在地图上。纬度和经度坐标用于标记设备的路线。速度信息用于给路线添加颜色。最终结果是设备行程的位置和速度的可视化表示。

此示例需要 Mapping Toolbox™。

设置您的移动设备

为了在 MATLAB® 中接收来自移动设备的数据,您需要在您的移动设备上安装和设置 MATLAB Mobile™ App。

从 MATLAB Mobile 的“设置”登录到 MathWorks® Cloud。

创建与移动设备的连接

在 MATLAB Mobile 的命令屏幕上,使用 mobiledev 命令创建一个表示您的移动设备的对象。

m = mobiledev;

输出应显示 Connected: 1,表明 mobiledev 对象已成功建立与该 App 的连接。

准备从位置传感器获取数据

为了收集 GPS 数据,请首先确保您设备的 GPS 已打开。如果已在移动设备的位置设置上启用了移动网络或 Wi-Fi,也可用它们来确定位置。

在移动设备上启用位置传感器。

m.PositionSensorEnabled = 1;

数据出现在 MATLAB Mobile 的传感器屏幕上可能需要一些时间,因为设备需要搜索 GPS 信号。GPS 信号在室内通常不可用。

开始获取数据

启用传感器后,MATLAB Mobile 的传感器屏幕将显示传感器测量的当前数据。Logging 属性允许您开始向 mobiledev 发送传感器数据。

m.Logging = 1;

收集位置数据

现在 mobiledev 正在记录设备上所记录的所有位置传感器数据。

在此示例中,设备采集的数据来自在 MathWorks 附近的一次短途行驶记录。

停止记录数据

再次使用 mobiledev 的记录属性以停止记录数据。

m.Logging = 0;

检索记录的位置数据

要创建地图,需要纬度、经度和速度数据。poslog 函数可用于从 mobiledev 检索这些信息。

[lat,lon,t,spd] = poslog(m);

对于此示例,系统已记录和保存了数据。

load drivingAroundMathWorks lat lon spd;

将速度划分为以颜色值表示的 bin

对速度值分 bin 以便使用离散数量的颜色来表示观测到的速度。

nBins = 10;
binSpacing = (max(spd) - min(spd))/nBins; 
binRanges = min(spd):binSpacing:max(spd)-binSpacing; 

% Add an inf to binRanges to enclose the values above the last bin.
binRanges(end+1) = inf;

% |histc| determines which bin each speed value falls into.
[~, spdBins] = histc(spd, binRanges);

按速度拆分纬度和经度数据

为每个速度 bin 创建一个不连续线段。将为每个线段分配一种颜色。相对于将每对相邻的纬度和经度值视为其自己的线段,上述做法创建的总线段数要少得多。

使用 Mapping Toolbox 中的 geoshape 将各线段存储为地理特征。

lat = lat';
lon = lon';
spdBins = spdBins';

% Create a geographical shape vector, which stores the line segments as
% features.
s = geoshape();

for k = 1:nBins
    
    % Keep only the lat/lon values which match the current bin. Leave the 
    % rest as NaN, which are interpreted as breaks in the line segments.
    latValid = nan(1, length(lat));
    latValid(spdBins==k) = lat(spdBins==k);
    
    lonValid = nan(1, length(lon));
    lonValid(spdBins==k) = lon(spdBins==k);    

    % To make the path continuous despite being segmented into different
    % colors, the lat/lon values that occur after transitioning from the
    % current speed bin to another speed bin will need to be kept.
    transitions = [diff(spdBins) 0];
    insertionInd = find(spdBins==k & transitions~=0) + 1;

    % Preallocate space for and insert the extra lat/lon values.
    latSeg = zeros(1, length(latValid) + length(insertionInd));
    latSeg(insertionInd + (0:length(insertionInd)-1)) = lat(insertionInd);
    latSeg(~latSeg) = latValid;
    
    lonSeg = zeros(1, length(lonValid) + length(insertionInd));
    lonSeg(insertionInd + (0:length(insertionInd)-1)) = lon(insertionInd);
    lonSeg(~lonSeg) = lonValid;

    % Add the lat/lon segments to the geographic shape vector.
    s(k) = geoshape(latSeg, lonSeg);
    
end

创建 Web 地图和路线叠加

这些线段现在可以组合成一个 Web 地图显示。纬度和经度数据已经过处理,可以以单独的线段形式来叠加在地图上。每个线段都有一种颜色,对应于在相应位置记录的速度。

Mapping Toolbox 提供了许多处理 Web 地图的函数。

使用 webmap 在浏览器中打开一个 Web 地图。

wm = webmap('Open Street Map');

作为参考,我们在地图上标记了 MathWorks 的位置。

mwLat = 42.299827;
mwLon = -71.350273;
name = 'MathWorks';
iconDir = fullfile(matlabroot,'toolbox','matlab','icons');
iconFilename = fullfile(iconDir, 'matlabicon.gif');
wmmarker(mwLat, mwLon, 'FeatureName', name, 'Icon', iconFilename);

使用 autumn 颜色图生成与速度 bin 对应的颜色列表。这将为每个 bin 创建一个具有 RGB 值的 [nBins x 3] 矩阵。

colors = autumn(nBins);

使用地理形状向量在 Web 地图上绘制一个线条。该形状向量的每个元素对应于一个分 bin 速度值的非连续线段。这些元素与刚刚创建的颜色列表的元素相匹配。

wmline(s, 'Color', colors, 'Width', 5);

放大地图并聚焦于路线。

wmzoom(16);

最终显示提供整个路线中位置和速度的可视化表示。显然,在停车场和转弯时,设备的行进速度比在直道上慢。

清理

关闭位置传感器并清理 mobiledev

m.PositionSensorEnabled = 0;

clear m;