Main Content

모바일 기기에서 GPS 데이터를 수집하고 현재 위치와 속력을 지도에 플로팅하기

이 예제에서는 Android™ 또는 iOS 모바일 기기에서 위치 데이터를 수집하고 지도에 표시하는 방법을 보여줍니다. 위도와 경도 좌표를 사용하여 기기의 경로를 표시합니다. 속력 정보를 사용하여 경로에 색을 추가합니다. 최종 결과로, 기기가 이동하는 동안의 위치와 속력이 시각적으로 표시됩니다.

이 예제를 수행하려면 Mapping Toolbox™가 필요합니다.

모바일 기기 설정하기

MATLAB®에서 모바일 기기로부터 데이터를 수신하려면 모바일 기기에 MATLAB Mobile™ 앱을 설치하고 설정해야 합니다.

MATLAB Mobile 설정에서 MathWorks® Cloud에 로그인합니다.

모바일 기기에 대한 연결 만들기

MATLAB Mobile의 명령 화면에서 mobiledev 명령을 사용하여 모바일 기기를 나타내는 객체를 만듭니다.

m = mobiledev;

출력에 mobiledev 객체가 앱에 대한 연결을 성공적으로 설정했음을 나타내는 Connected: 1이 표시되어야 합니다.

위치 센서에서 오는 데이터 수집 준비하기

GPS 데이터를 수집하려면 먼저 기기의 GPS가 켜져 있는지 확인해야 합니다. 모바일 기기의 위치 설정에서 모바일 네트워크와 Wi-Fi가 활성화된 경우 이를 사용하여 위치를 확인할 수도 있습니다.

모바일 기기에서 위치 센서를 활성화합니다.

m.PositionSensorEnabled = 1;

기기가 GPS 신호를 찾아야 하기 때문에 데이터가 MATLAB Mobile의 센서 화면에 표시될 때까지는 시간이 걸릴 수 있습니다. GPS 신호는 일반적으로 실내에서는 수신할 수 없습니다.

데이터 수집 시작하기

센서를 활성화하면 MATLAB Mobile의 센서 화면에 센서가 측정한 현재 데이터가 표시됩니다. Logging 속성을 사용하면 센서 데이터를 mobiledev로 보내기 시작할 수 있습니다.

m.Logging = 1;

위치 데이터 수집하기

기기에서 기록되는 모든 위치 센서 데이터를 이제 mobiledev에 기록합니다.

이 예제에서는 기기를 가지고 MathWorks 주위를 차로 짧게 이동했습니다.

데이터 기록 중지하기

mobiledev의 Logging 속성을 다시 사용하여 데이터 기록을 중지합니다.

m.Logging = 0;

기록된 위치 데이터 가져오기

지도를 생성하려면 위도, 경도 및 속력 데이터가 필요합니다. poslog 함수를 사용하여 mobiledev에서 이러한 정보를 가져올 수 있습니다.

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

이 예제에서는 데이터가 이미 기록되고 저장되어 있습니다.

load drivingAroundMathWorks lat lon spd;

속력을 색 값으로 비닝하기

관측된 속력을 나타내는 데 한정된 개수의 색상을 사용할 수 있도록 속력 값을 비닝합니다.

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

웹 지도와 경로 오버레이 만들기

이제 이러한 요소를 웹 지도 표시 항목에 결합할 수 있습니다. 위도와 경도 데이터를 처리하여 지도 위에 겹칠 개별 선분을 구성했습니다. 각 선분마다 해당 위치에서 기록된 속력에 해당하는 색이 있습니다.

Mapping Toolbox는 웹 지도에 사용할 수 있는 여러 함수를 제공합니다.

webmap을 사용하여 브라우저에서 웹 지도를 엽니다.

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);

지리 형상 벡터를 사용하여 웹 지도에 선을 그립니다. 형상 벡터의 각 요소는 비닝된 속력 값에 대한 불연속 선분에 해당합니다. 이러한 요소는 방금 생성한 색 목록의 요소와 일치합니다.

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

지도에서 경로를 확대합니다.

wmzoom(16);

최종적으로, 전체 경로에 대한 위치와 속력이 시각적으로 표시됩니다. 기기는 직진하는 경우보다 주차장에 있거나 좌회전 또는 우회전하는 동안에 확실히 더 느리게 이동했습니다.

정리하기

위치 센서를 끄고 mobiledev를 지웁니다.

m.PositionSensorEnabled = 0;

clear m;