Анимационные слои данных

Создайте Фильм Карт Terra/MODIS

Можно создать карты той же географической области в разное время и просмотреть их как фильм. Сроком на семь дней считайте и отобразите ежедневный составной объект визуальных изображений от Умеренного Спектрорадиометра Обработки изображений Разрешения НАСА (MODIS) сцены, полученные в течение месяца декабря 2010.

Ищите Базу данных WMS слой MODIS.

neo = wmsfind('neowms*nasa','SearchField','serverurl'); 
modis = refine(neo,'true*color*terra*modis'); 
modis = wmsupdate(modis);

Создайте WebMapServer возразите и WMSMapRequest объект.

server = WebMapServer(modis.ServerURL);
mapRequest = WMSMapRequest(modis,server);

Extent поле предоставляет информацию о том, как получить отдельные системы координат. Можно запросить один день, потому что степень задана за день ('/P1D'). Обратите внимание на то, что на декабрь 2010, системы координат на 8 декабря и 31 декабря не доступны.

modis.Details.Dimension.Extent
ans = 
'2006-09-01/2006-09-14/P1D,2006-09-17/2006-10-10/P1D,2006-10-12/2006-11-18/P1D,2006-11-21/2007-03-01/P1D,2007-03-03/2007-08-16/P1D,2007-08-18,2007-08-20/2007-09-11/P1D,2007-09-15/2007-12-30/P1D,2008-01-01/2008-01-24/P1D,2008-01-27/2008-02-24/P1D,2008-02-26/2008-03-18/P1D,2008-03-20/2008-06-12/P1D,2008-06-14,2008-06-16/2008-07-12/P1D,2008-07-14/2008-09-17/P1D,2008-09-19,2008-09-22/2008-10-17/P1D,2008-10-19/2008-10-22/P1D,2008-10-28/2008-12-02/P1D,2008-12-04/2008-12-20/P1D,2008-12-23/2008-12-30/P1D,2009-01-01/2009-01-20/P1D,2009-01-22/2009-04-19/P1D,2009-04-23/2009-07-05/P1D,2009-07-08/2009-12-30/P1D,2010-01-01/2010-07-16/P1D,2010-07-18/2010-12-07/P1D,2010-12-09/2010-12-30/P1D,2011-01-01/2011-01-25/P1D,2011-01-27/2011-03-19/P1D,2011-03-21/2011-07-23/P1D,2011-07-27/2011-08-27/P1D,2011-08-30/2011-12-13/P1D,2011-12-15/2012-02-19/P1D,2012-02-21/2013-12-01/P1D,2013-12-04/2018-03-12/P1D,2018-03-14/2018-05-16/P1D,2018-05-18/2018-09-17/P1D,2018-09-19/2021-04-06/P1D'

Создайте массив, указывающий на первые семь дней. Установите время начала до 1 декабря 2010 и используйте последовательный номер даты.

days = 1:7;
time = '2010-12-01';
startTime = datenum(time);

Создайте окно фигуры с осями, подходящими для области, заданной слоем MODIS.

hFig = figure;
worldmap(mapRequest.Latlim,mapRequest.Lonlim);

Сохраните каждую систему координат в видеофайл.

videoFilename = 'modis_dec.avi';
writer = VideoWriter(videoFilename);
writer.FrameRate = 1;
writer.Quality = 100;
writer.open;

Установите Visible свойство фигуры к 'off' скрыть фигуру при заполнении систем координат. В течение каждого дня считайте карту слоя MODIS. Установите Time свойство к дневному номеру. Проигнорируйте данные, не найденные на сервере или ошибках, выпущенных сервером при помощи try/catch оператор. Для правильной индексации, набор время начала к одному дню меньше.

hFig.Visible = 'off';
startTime = startTime - 1;
for k = days
    try
        mapRequest.Time = startTime + k;
        timeStr = datestr(mapRequest.Time);
        dailyImage = getMap(server,mapRequest.RequestURL);
        geoshow(dailyImage,mapRequest.RasterReference);
        title({mapRequest.Layer.LayerTitle,timeStr}, ...
            'Interpreter','none','FontWeight','bold')
        frame = getframe(hFig);
        writer.writeVideo(frame);
    catch e
        fprintf(['Server error: %s.\n', ...
            'Ignoring frame number %d on day %s.\n'], ...
            e.message,k,timeStr)
    end
end
writer.close

Читайте во всех видеокадрах.

v = VideoReader(videoFilename);
vidFrames = read(v);
numFrames = get(v,'NumFrames');

Создайте структуру фильма из видеокадров.

frames = struct('cdata',[],'colormap',[]);
frames(numFrames) = frames(1);
for k = 1 : numFrames
    frames(k).cdata = vidFrames(:,:,:,k);
    frames(k).colormap = [];
end

Установите Visible свойство фигуры к 'on' и проигрывайте фильм однажды в частоте кадров видео.

hFig.Visible = 'on';
shg
movie(hFig,frames,1,v.FrameRate)

Создайте анимированный GIF карт WMS

Считайте и отобразите анимацию Шельфового ледника Ларсена, испытывающего поразительный коллапс между 31 января 2002 и 7 марта 2002.

Ищите Базу данных WMS фразу 'Larsen Ice Shelf'.

iceLayer = wmsfind('Larsen Ice Shelf');

Создайте WebMapServer путем определения сервера URL первого слоя. Синхронизируйте слой с сервером при помощи updateLayers функция.

server = WebMapServer(iceLayer(1).ServerURL);
iceLayer = updateLayers(server,iceLayer(1));

Создайте WMSMapRequest объект.

request = WMSMapRequest(iceLayer(1),server);

Extent поле вводит доступные значения для размерности в это время случая. Установите значение степени к переменной. Вычислите количество необходимых систем координат.

extent = string(iceLayer.Details.Dimension.Extent);
extent = split(extent,",");
numFrames = numel(extent);

Создайте фигуру и настройте карту с соответствующими географическими пределами. Настройте внешний вид параллелей и меридианов.

f = figure;
worldmap(request.Latlim,request.Lonlim)
setm(gca,'MLineLocation',1,'MLabelLocation',1, ...
   'MLabelParallel',-67.5,'LabelRotation','off');

Инициализируйте значение animated к 0.

animated(1,1,1,numFrames) = 0;

Установите Visible свойство фигуры к 'off' скрыть карту при заполнении систем координат. Считайте изображение Шельфового ледника Ларсена в различные дни.

f.Visible = 'off';
for k=1:numFrames
   request.Time = extent(k);
   iceImage = getMap(server,request.RequestURL);
   geoshow(iceImage,request.RasterReference)
   title(request.Time,'Interpreter','none')
   frame = getframe(f);
   if k == 1
      [animated, cmap] = rgb2ind(frame.cdata,256,'nodither');
   else
      animated(:,:,1,k) = rgb2ind(frame.cdata,cmap,'nodither');
   end
   pause(2)
end

Сохраните системы координат как анимированный GIF и просмотрите GIF в браузере.

filename = 'wmsanimated.gif';
imwrite(animated,cmap,filename,'DelayTime',1.5, ...
   'LoopCount',inf);
web(filename) 

Создайте анимацию радарных наблюдений таймлапса

Отобразите Радар Следующего поколения (NEXRAD) изображения для данных об использовании Соединенных Штатов из веб-сервера карты Айовы экологической мезосети (IEM). Сервер хранит слои, покрывающие прошлые 50 минут до настоящего времени время с шагом 5 минут. Считайте и отобразите объединенные слои.

Найдите слои в Базе данных WMS, которые включают 'mesonet' и 'nexrad' в их ServerURL поля .

mesonet = wmsfind('mesonet*nexrad','SearchField','serverurl');

NEXRAD основное текущее отражение ('nexrad-n0r') измеряет интенсивность осадков. Совершенствуйте свой поиск, чтобы включать только слои с этой фразой в одном из полей поиска.

nexrad = refine(mesonet,'nexrad-n0r','SearchField','any');

Удалите 900 913 слоев, потому что они предназначаются для наложения Google Maps™. Удалите слой WMST, потому что он содержит данные в течение различных времен.

layers_900913 = refine(nexrad,'900913','SearchField', ...
   'layername'); 
layer_wmst = refine(nexrad,'wmst', 'SearchField', 'layername'); 
rmLayerNames = {layers_900913.LayerName layer_wmst.LayerName}; 
index = ismember({nexrad.LayerName}, rmLayerNames); 
nexrad = nexrad(~index); 

Обновите nexrad слой, чтобы заполнить все поля и получить новые данные.

nexrad = wmsupdate(nexrad,'AllowMultipleServers',true); 

Создайте карту совпадающих Соединенных Штатов. Получите пределы широты и долготы карты.

figure
usamap('conus')
mstruct = gcm;
latlim = mstruct.maplatlimit;
lonlim = mstruct.maplonlimit;

Считайте и отобразите объединенные слои.

[A,R] = wmsread(nexrad,'Latlim',latlim,'Lonlim',lonlim);
geoshow(A,R)
geoshow('usastatehi.shp','FaceColor','none')
title({'NEXRAD Radar Map', 'Merged Layers'})

Цикл через последовательность радарных наблюдений таймлапса. Установите Visible свойство фигуры к 'off' скрыть фигуру при заполнении систем координат.

hfig = figure('Visible','off');
usamap('conus')
hstates = geoshow('usastatehi.shp','FaceColor','none');
numFrames = numel(nexrad);
frames = struct('cdata',[],'colormap',[]);
frames(numFrames) = frames;
hmap = [];
frameIndex = 0;
for k = numFrames:-1:1
   frameIndex = frameIndex + 1;
   delete(hmap)
   [A, R] = wmsread(nexrad(k),'Latlim',latlim,'Lonlim',lonlim);
   hmap = geoshow(A,R);
   uistack(hstates,'top')
   title(nexrad(k).LayerName)
   frames(frameIndex) = getframe(hfig);
end

Создайте массив, чтобы выписать как анимированный GIF.

animated(1,1,1,numFrames) = 0;
for k=1:numFrames
   if k == 1
      [animated,cmap] = rgb2ind(frames(k).cdata,256,'nodither');
   else
      animated(:,:,1,k) = ...
         rgb2ind(frames(k).cdata,cmap,'nodither');
   end     
end

Сохраните анимированный GIF и просмотрите его в браузере.

filename = 'wmsnexrad.gif';
imwrite(animated,cmap,filename,'DelayTime',1.5, ...
   'LoopCount',inf);
web(filename)

Смотрите также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте