Newer
Older
% Очищаем командную строку (Command Window)
clc
% Очищаем Workspace (удаляем все переменные)
clear all
%% Скачиваем себе на компьютер данные реанализа, которые лежат на сервере (ничего не меняем!)
% Данные скачичаются в ту папку, которая открыта в окне слева (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);
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
%% Открываем данные
% Прописываем путь к файлу
% Знак точка с запятой ";" в конце строки блокирует вывод полученного в ходе
% выполнения команды результата в командной строке
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