Skip to content
Snippets Groups Projects
Test1.m 9.79 KiB
Newer Older
mkolennikova's avatar
mkolennikova committed
% Очищаем командную строку (Command Window)
clc
% Очищаем Workspace (удаляем все переменные)
clear all

mkolennikova's avatar
mkolennikova committed
%% Скачиваем себе на компьютер данные реанализа, которые лежат на сервере (ничего не меняем!)
% Данные скачичаются в ту папку, которая открыта в окне слева (Current Folder)
% Проделать эту операцию нужно один раз, потом можно просто закомментировать этот блок
furl ='http://kibel.srcc.msu.ru:8080/share.cgi?ssid=5743fc3a82a14733a325cf8c68398db2&fid=5743fc3a82a14733a325cf8c68398db2&filename=surface_t2m_precip.nc&openfolder=forcedownload&ep='
fname = 'surface_t2m_precip.nc'
fpath= websave(fname, furl);

mkolennikova's avatar
mkolennikova committed
%% Открываем данные
% Прописываем путь к файлу
% Знак точка с запятой ";" в конце строки блокирует вывод полученного в ходе 
% выполнения команды результата в командной строке
filepath = "C:\";
% Прописываем название файла
filename = "surface_t2m_precip.nc";
% Просматриваем содержимое файла NetCDF командой ncdisp (переменные, их размерность и др.)
% Информация отображается в командной строке 
ncdisp (filepath + filename);

% Выбираем необходимые нам переменные
% Загружаем в Workspace температуру на 2 метрах командой ncread
% В скобках указываем название переменной - то, как она называется в файле
% В Workspace должна появиться переменная t2m_data в виде массива
% размерностью 1440*721*3 (долготы*широты*время)
t2m_data = ncread(filepath + filename, 't2m');
% Аналогичным образом загружаем векторы с долготами, широтами и временем
% Если нажать на появившиеся перемнные, в окошке Variables можно
% посмотреть, что содержится внутри них
lonn = ncread(filepath + filename, 'longitude');
latt = ncread(filepath + filename, 'latitude');
time = ncread(filepath + filename, 'time');

%% Преобразовываем данные
% Данные по температуре даны в Кельвинах -> переводим их в градусы Цельсия
t2m_data_Celsius = t2m_data - 273.15;

% Данные о времени даны в количестве часов с 00:00 1 января 1900 г. -> переводим их в понятные нам даты
% В Matlab'е есть команда datenum для работы с данными формата даты
% Она переводит заданную дату в количество дней с 00:00 1 января 0000 г.
% создадим переменную t0 - количество дней с 00:00 1 января 0000 г. по 00:00 1 января 1900 г.
t0 = datenum('1900-01-01 00:00:00', 'yyyy-mm-dd HH:MM:SS');
% переведем даты из нашего файла из формата "часы с 00:00 1 января 1900 г."
% в "дни с с 00:00 1 января 1900 г."
% time_days_since1900year - количество дней с 00:00 1 января 1900 г.по
% даты, указанные в файле. Точка перед знаком деления обозначает, что
% данная арифметическая операция применяется отдельно к каждому члену
% массива
time_days_since1900year = time ./ 24;
% сложим две переменные между собой, чтобы получить time_days_since0year - количество дней с 00:00 1 января 0000 г. 
% по даты, указанные в файле
time_days_since0year = time_days_since1900year + t0;
% конвертируем с помощью команды datetime из формата "дни с с 00:00 1 января 0000 г." в нормальный вид, 
% указав при этом, что стартуем именно с 0000 года флагом 'datenum'
% если нажать на переменную time_real, можно увидеть, за какие даты даны
% данные
time_I_understand = datetime(time_days_since0year, 'ConvertFrom', 'datenum');

%% Отрисовка данных на карте
% Переворачиваем командой flipud вектор широт, чтобы они начинались с -90
latt1 = flipud(latt);
% Строим координатную сетку с размерностью долгот и широт
[lon,lat] = meshgrid(lonn, latt1);

% Открываем окно для нашего рисунка во весь экран
figure('units','normalized','outerposition',[0 0 1 1])
% Указываем проекцию и координаты
m_proj ('Equidistant Cylindrical','lon',[0 360], 'lat', [-90 90]);
% Выбираем переменную за первый шаг по времени 
t2m_data_one_time = t2m_data_Celsius(:,:,1);
% Транспонируем (знак апострофа "'") -> меняем местами
% размерности), так как сетка имеет размерность широты*долготы
t2m_data_Celsius_transp = t2m_data_one_time';
% Отрисовываем переменную, заодно переворачивая её командой flipud, чтобы
% данные начинались с 90° ю.ш.
m_contourf(lon, lat, flipud(t2m_data_Celsius_transp),'LineColor','none', 'LevelStep', 5);
% Отрисовываем линию побережья
m_coast('Color', 'k','LineWidth', 1)
% Наносим линии сетки
m_grid
% Обозначаем цветовую шкалу
colormap(turbo)
% Выводим цветовую шкалу на рисунок
c = colorbar;
% Подписываем шкалу
c.Label.String = 'Temperature, °C';
% Поворачиваем её на -90 градусов
c.Label.Rotation = -90;
% Сдвигаем её, чтобы она не заезжала на шкалу после поворота
c.Label.Position = [3.5 -12.5 0];
% Определяем размер шрифта подписи
c.Label.FontSize = 12;

% Добавляем название рисунка
% Команада datestr переводит значение переменной из формата даты в формат
% строки
% По умолчанию название будет написано жирным шрифтом -> команда 'FontWeight','Normal'
% делает подпись обычной
title("Air temperature at 2 m - " + datestr(time_I_understand(1), 'mmmm, yyyy'),'FontWeight','Normal','FontSize',16)
    
%% Отрисовка данных на карте циклом для всех точек по времени и сохранение рисунков
% Цикл от 1 до длины вектора с точками по времени, то есть от 1 до 3 с
% шагом 1
for i = 1:length(time_I_understand)
    % Открываем окно для нашего рисунка во весь экран
    figure('units','normalized','outerposition',[0 0 1 1])
    % Указываем проекцию и координаты
    m_proj ('Equidistant Cylindrical','lon',[0 360], 'lat', [-90 90]);
    % Выбираем переменную за конкретный шаг по времени 
    t2m_data_one_time = t2m_data_Celsius(:,:,i);
    % Транспонируем (знак апострофа "'") -> меняем местами
    % размерности), так как сетка имеет размерность широты*долготы
    t2m_data_Celsius_transp = t2m_data_one_time';
    % Отрисовываем переменную, заодно переворачивая её командой flipud, чтобы
    % данные начинались с 90° ю.ш.
    m_contourf(lon, lat, flipud(t2m_data_Celsius_transp),'LineColor','none', 'LevelStep', 5);
    % Отрисовываем линию побережья
    m_coast('Color', 'k','LineWidth', 1)
    % Наносим линии сетки
    m_grid
    % Обозначаем цветовую шкалу
    colormap(turbo)
    % Выводим цветовую шкалу на рисунок
    c = colorbar;
    % Подписываем шкалу
    c.Label.String = 'Temperature, °C';
    % Поворачиваем её на -90 градусов
    c.Label.Rotation = -90;
    % Сдвигаем её, чтобы она не заезжала на шкалу после поворота
    c.Label.Position = [3.5 -12.5 0];
    % Определяем размер шрифта подписи
    c.Label.FontSize = 12;
    % Ограничиываем размах значений шкалы
    clim([-70 45])
    % Добавляем название рисунка
    % Команада datestr переводит значение переменной из формата даты в формат
    % строки
    % По умолчанию название будет написано жирным шрифтом -> команда 'FontWeight','Normal'
    % делает подпись обычной
    title("Air temperature at 2 m - " + datestr(time_I_understand(i), 'mmmm, yyyy'),'FontWeight','Normal','FontSize',16)
    
    % Сохраняем рисунок в формате png с разрешением 300 dpi
    print("T2m_temperature_" + datestr(time_I_understand(i), 'mmmm_yyyy'), '-dpng', '-r300');

end