exponenta event banner

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

Создание фильма карт Terra/MODIS

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

  1. Выполните поиск уровня MODIS в базе данных WMS.

    neo = wmsfind('neowms*nasa', 'SearchField', 'serverurl'); 
    modis = neo.refine('true*color*terra*modis'); 
    modis = wmsupdate(modis); 
    
  2. Построить WebMapServer объект.

    server = WebMapServer(modis.ServerURL);
    
  3. Построить WMSMapRequest объект.

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

    modis.Details.Dimension.Extent
  5. Создайте массив, указывающий первые семь дней.

    days = 1:7;
    
  6. Установка значения startTime до 01 декабря 2010 года и использовать серийный номер даты.

    time = '2010-12-01';
    startTime = datenum(time);
    
  7. Откройте окно фигуры с осями, соответствующими области, указанной modis слой.

    hFig = figure('Color', 'white');
    worldmap(mapRequest.Latlim, mapRequest.Lonlim);
    
  8. Сохраните каждый кадр в видеофайл.

    videoFilename = 'modis_dec.avi';
    writer = VideoWriter(videoFilename);
    writer.FrameRate = 1;
    writer.Quality = 100;
    writer.open;
    
  9. Получение карты 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
    
  10. Читать на всех видеокадрах.

    v = VideoReader(videoFilename);
    vidFrames = read(v);
    numFrames = get(v, 'NumberOfFrames');
    
  11. Создайте структуру фильма MATLAB ® на основе видеокадров.

    frames = struct('cdata', [], 'colormap', []);
    frames(numFrames) = frames(1);
    for k = 1 : numFrames
        frames(k).cdata = vidFrames(:,:,:,k);
        frames(k).colormap = [];
    end
    
  12. Воспроизведение фильма один раз с частотой кадров видео.

    movie(hFig, frames, 1, v.FrameRate)

Создание анимированного GIF-файла WMS-карт

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

  1. Найдите в базе данных WMS фразу «Ледниковый шельф Ларсена».

    iceLayer = wmsfind('Larsen Ice Shelf');

    Попробуйте первый слой.

  2. Построить WebMapServer объект.

    server = WebMapServer(iceLayer(1).ServerURL);
    
  3. Используйте WebMapServer.updateLayers метод синхронизации уровня с исходным сервером WMS. Извлеките последние данные и заполните Abstract, CoordRefSysCodes, и Details поля.

    iceLayer = server.updateLayers(iceLayer(1));
    
  4. Просмотрите аннотацию.

    fprintf('%s\n', iceLayer(1).Abstract)
  5. Создать WMSMapRequest объект.

    request = WMSMapRequest(iceLayer(1), server);
    
  6. Поскольку вы обновили свой слой, Details поле теперь содержит содержимое. Щелкнуть Details в редакторе переменных MATLAB. Затем нажмите Dimension. Имя измерения: 'time'. Щелкнуть Extent. Extent В этом случае поле содержит доступные значения для измерения. Сохраните эту информацию, введя в командной строке следующее:

    extent = [',' iceLayer.Details.Dimension.Extent, ','];
    
  7. Вычислите количество требуемых кадров. ( extent содержит запятую перед первым кадром и после последнего кадра. Чтобы получить количество кадров, вычтите 1.)

    frameIndex = strfind(extent, ',');
    numFrames = numel(frameIndex) - 1;
  8. Откройте окно фигуры и настройте оси карты с соответствующими географическими пределами.

    h = figure;
    worldmap(request.Latlim, request.Lonlim)
    
  9. Задайте свойства осей карты. MLineLocation устанавливает интервал между отображаемыми меридианами сетки. MLabelParallel определяет параллель, в которой отображаются метки.

    setm(gca,'MLineLocation', 1, 'MLabelLocation', 1, ...
       'MLabelParallel',-67.5, 'LabelRotation', 'off');
    
  10. Инициализировать значение animated в 0.

    animated(1,1,1,numFrames) = 0;
    
  11. Отображение изображения Ледникового шельфа Ларсена в разные дни.

    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
  12. Сохраните и просмотрите анимированный GIF-файл.

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

    Снимок из анимации ледяного шельфа Ларсена

    С любезностью НАСА/Центр космических полетов Годдарда, Студия научной визуализации

Анимация радиолокационных наблюдений по времени

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

  1. Поиск уровней в базе данных WMS, включающих 'mesonet' и 'nexrad' в их ServerURL поля.

    mesonet = wmsfind('mesonet*nexrad', 'SearchField', 'serverurl');
    
  2. База NEXRAD отражает ток ('nexrad-n0r') измеряет интенсивность осадков. Уточните поиск, чтобы включить в одно из полей поиска только слои с этой фразой.

    nexrad = mesonet.refine('nexrad-n0r', 'SearchField', 'any');
    
  3. Удалите слои 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); 
    
  4. Обновите nexrad слой для заполнения всех полей и получения последних данных.

    nexrad = wmsupdate(nexrad, 'AllowMultipleServers', true); 
  5. '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);
    
  6. Отображение карты объединенных слоев NEXRAD. Наложение на полигоны границы штата США.

    geoshow(A, R);
    geoshow('usastatehi.shp', 'FaceColor', 'none');
    title({'NEXRAD Radar Map', 'Merged Layers'});
    

  7. Петля через последовательность временных радиолокационных наблюдений.

    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
  8. Создайте массив для записи в виде анимированного 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
    
  9. Просмотр анимированного GIF-файла.

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

См. также

| |

Связанные темы