% Очищаем командную строку (Command Window) clc % Очищаем Workspace (удаляем все переменные) clear all %% Открываем данные % Прописываем путь к файлу % Знак точка с запятой ";" в конце строки блокирует вывод полученного в ходе % выполнения команды результата в командной строке 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