Можно создавать карты одного и того же географического региона в разное время и просматривать их как фильм. В течение семи дней считывайте и отображайте ежедневный набор визуальных изображений со сцен НАСА «Спектрорадиометр визуализации с умеренным разрешением» (MODIS), снятых в декабре 2010 года.
Выполните поиск уровня MODIS в базе данных WMS.
neo = wmsfind('neowms*nasa', 'SearchField', 'serverurl'); modis = neo.refine('true*color*terra*modis'); modis = wmsupdate(modis);
Построить WebMapServer объект.
server = WebMapServer(modis.ServerURL);
Построить WMSMapRequest объект.
mapRequest = WMSMapRequest(modis, server);
Extent содержит информацию о том, как извлекать отдельные кадры. Можно запросить один день, так как экстент определяется по дням ('/P1D'). Отметим, что на декабрь 2010 года рамки на 8 декабря и 31 декабря недоступны.
modis.Details.Dimension.Extent
Создайте массив, указывающий первые семь дней.
days = 1:7;
Установка значения startTime до 01 декабря 2010 года и использовать серийный номер даты.
time = '2010-12-01';
startTime = datenum(time);
Откройте окно фигуры с осями, соответствующими области, указанной modis слой.
hFig = figure('Color', 'white'); worldmap(mapRequest.Latlim, mapRequest.Lonlim);
Сохраните каждый кадр в видеофайл.
videoFilename = 'modis_dec.avi';
writer = VideoWriter(videoFilename);
writer.FrameRate = 1;
writer.Quality = 100;
writer.open;
Получение карты modis уровень для каждого запрашиваемого дня. Установите Time свойство к номеру дня. При получении данных с сервера используйте try/catch для игнорирования данных, не найденных на сервере, или ошибок, выданных сервером. Набор startTime на один день меньше для правильной индексации.
startTime = startTime - 1; for k = days try mapRequest.Time = startTime + k; timeStr = datestr(mapRequest.Time); dailyImage = server.getMap(mapRequest.RequestURL); geoshow(dailyImage, mapRequest.RasterReference); title({mapRequest.Layer.LayerTitle, timeStr}, ... 'Interpreter', 'none', 'FontWeight', 'bold') shg 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 drawnow shg end writer.close
Читать на всех видеокадрах.
v = VideoReader(videoFilename);
vidFrames = read(v);
numFrames = get(v, 'NumberOfFrames');
Создайте структуру фильма MATLAB ® на основе видеокадров.
frames = struct('cdata', [], 'colormap', []); frames(numFrames) = frames(1); for k = 1 : numFrames frames(k).cdata = vidFrames(:,:,:,k); frames(k).colormap = []; end
Воспроизведение фильма один раз с частотой кадров видео.
movie(hFig, frames, 1, v.FrameRate)
Прочитайте и отобразите анимацию Ледникового шельфа Ларсена, переживающего драматический коллапс между 31 января и 7 марта 2002 года.
Найдите в базе данных WMS фразу «Ледниковый шельф Ларсена».
iceLayer = wmsfind('Larsen Ice Shelf');Попробуйте первый слой.
Построить WebMapServer объект.
server = WebMapServer(iceLayer(1).ServerURL);
Используйте WebMapServer.updateLayers метод синхронизации уровня с исходным сервером WMS. Извлеките последние данные и заполните Abstract, CoordRefSysCodes, и Details поля.
iceLayer = server.updateLayers(iceLayer(1));
Просмотрите аннотацию.
fprintf('%s\n', iceLayer(1).Abstract)Создать WMSMapRequest объект.
request = WMSMapRequest(iceLayer(1), server);
Поскольку вы обновили свой слой, Details поле теперь содержит содержимое. Щелкнуть Details в редакторе переменных MATLAB. Затем нажмите Dimension. Имя измерения: 'time'. Щелкнуть Extent. Extent В этом случае поле содержит доступные значения для измерения. Сохраните эту информацию, введя в командной строке следующее:
extent = [',' iceLayer.Details.Dimension.Extent, ','];
Вычислите количество требуемых кадров. ( extent содержит запятую перед первым кадром и после последнего кадра. Чтобы получить количество кадров, вычтите 1.)
frameIndex = strfind(extent, ',');
numFrames = numel(frameIndex) - 1;Откройте окно фигуры и настройте оси карты с соответствующими географическими пределами.
h = figure; worldmap(request.Latlim, request.Lonlim)
Задайте свойства осей карты. MLineLocation устанавливает интервал между отображаемыми меридианами сетки. MLabelParallel определяет параллель, в которой отображаются метки.
setm(gca,'MLineLocation', 1, 'MLabelLocation', 1, ... 'MLabelParallel',-67.5, 'LabelRotation', 'off');
Инициализировать значение animated в 0.
animated(1,1,1,numFrames) = 0;
Отображение изображения Ледникового шельфа Ларсена в разные дни.
for k=1:numFrames request.Time = extent(frameIndex(k)+1:frameIndex(k+1)-1); iceImage = server.getMap(request.RequestURL); geoshow(iceImage, request.RasterReference) title(request.Time, 'Interpreter', 'none') drawnow shg frame = getframe(h); if k == 1 [animated, cmap] = rgb2ind(frame.cdata, 256, 'nodither'); else animated(:,:,1,k) = rgb2ind(frame.cdata, cmap, 'nodither'); end pause(2) end
Сохраните и просмотрите анимированный GIF-файл.
filename = 'wmsanimated.gif'; imwrite(animated, cmap, filename, 'DelayTime', 1.5, ... 'LoopCount', inf); web(filename)
Снимок из анимации ледяного шельфа Ларсена

С любезностью НАСА/Центр космических полетов Годдарда, Студия научной визуализации
Отображение радиолокационных изображений следующего поколения (NEXRAD) для США с использованием данных с сервера веб-карт Iowa Environmental Mesonet (IEM). Сервер хранит слои, охватывающие последние 50 минут до текущего времени с шагом 5 минут. Чтение и отображение объединенных слоев.
Поиск уровней в базе данных WMS, включающих 'mesonet' и 'nexrad' в их ServerURL поля.
mesonet = wmsfind('mesonet*nexrad', 'SearchField', 'serverurl');
База NEXRAD отражает ток ('nexrad-n0r') измеряет интенсивность осадков. Уточните поиск, чтобы включить в одно из полей поиска только слои с этой фразой.
nexrad = mesonet.refine('nexrad-n0r', 'SearchField', 'any');
Удалите слои 900913, так как они предназначены для наложения Google Maps™. Также удалите уровень WMST, поскольку он содержит данные для различных периодов времени.
layers_900913 = nexrad.refine('900913', 'SearchField', ... 'layername'); layer_wmst = nexrad.refine('wmst', 'SearchField', 'layername'); rmLayerNames = {layers_900913.LayerName layer_wmst.LayerName}; index = ismember({nexrad.LayerName}, rmLayerNames); nexrad = nexrad(~index);
Обновите nexrad слой для заполнения всех полей и получения последних данных.
nexrad = wmsupdate(nexrad, 'AllowMultipleServers', true); 'conus' представляет 48 штатов США (все, кроме Гавайев и Аляски). Используйте usamap для построения оси карты для граничных состояний. Читайте в nexrad слои.
region = 'conus'; figure usamap(region) mstruct = gcm; latlim = mstruct.maplatlimit; lonlim = mstruct.maplonlimit; [A, R] = wmsread(nexrad, 'Latlim', latlim, 'Lonlim', lonlim);
Отображение карты объединенных слоев NEXRAD. Наложение на полигоны границы штата США.
geoshow(A, R); geoshow('usastatehi.shp', 'FaceColor', 'none'); title({'NEXRAD Radar Map', 'Merged Layers'});

Петля через последовательность временных радиолокационных наблюдений.
hfig = figure; usamap(region) 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) drawnow 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)