Відкриваємо netcdf в matlab (на прикладі ncep реаналіза), записки океанолога - обробка та

Завдання: Відкрити файл формату netCDF в MATLAB
Рішення. чистий затьмарена MATLAB

Постараюся описати тут відповідь на це животрепетне питання, щоб було куди відправляти стражденних з різних форумів. Починаючи з версії 7.7, Matlab підтримує роботу з форматом netCDF нативної, без різних примочок, які були потрібні раніше. Синтаксис, який використовується для роботи з netCDF файлами досить дивний, ну да, не мені судити. Тут я опишу, як в Matlab зробити одну просту дію, а саме прочитати дані з файлу.

Якщо ви збираєтеся працювати з netCDF. то для початку непогано б ознайомитися з тим, що з себе представляє цей формат. В цьому випадку подальше то нема вам тоді здаватися абракадаброю. Але в загальному випадку можна обійтися і без цих унікальних знань, якщо все, що вам потрібно, це виколупати дані з файлу і забути про netCDF як про страшний сон. .? Нформация про функції Матлаб для роботи з netCDF розташована тут.

В результаті ви отримаєте табличку з даними по вашому файлу. За великим рахунком вас повинно цікавити тільки те що знаходиться в розділі Variables. тобто інформація про змінних, що містяться в вашому файлі. В даному прикладі це змінні lat (широти), lon (довготи), time (час минув від 1-1-1 00: 00: 0.0 в годинах), air (температура повітря в Кельвіна).

UPD. Кажуть що не у всіх релізах Матлаб є функція ncdisp. Якщо у вас той самий запущений випадок, то для виндоуз ви завантажуєте бінарники програми ncdump звідси. для Убунту Лінукс і йому подібних пишіть в терміналі:

sudo apt-get install netcdf-bin

Далі в терміналі виндоуз або лінукс вводите команду

по ідеї, якщо ви працюєте в Виндоуз, то програма ncdump.exe повинна бути в папці з файлом. Ця команда виведе вам приблизно ту ж інформацію що і ncdisp.

Спочатку давайте спробуємо здобути головне - температуру повітря. Насамперед потрібно відкрити файл, для того щоб Matlab міг з ним працювати:

З якихось своїх внутрішніх причин функції, які запитують дані з змінних netCDF. працюють не з їх іменами, а з їх порядковими номерами, тому нам потрібно дізнатися який порядковий номер змінної air:

>> varid = netcdf. inqVarID # 40; ncid, 'air' # 41;

Вийшов порядковий номер 3. Ми в загальному і самі могли це порахувати, знаючи, що рахунок змінних в даному випадку йде з нуля, а не з одиниці.
Тепер, знаючи порядковий номер netCDF змінної, ми можемо скопіювати значення з неї в змінну Матлаб:

data = netcdf. getVar # 40; ncid, 3 # 41; ;

У підсумку ви отримаєте тривимірну матрицю [довгота, широта, час]. Здавалося б задача вирішена, але не варто поспішати. Якщо ви погляньте на значення в змінній data. то вони будуть дуже віддалено нагадувати те, що ви очікуєте побачити, таких температур, навіть якщо вони виражені в Кельвіна, на Землі не буває. Справа в тому що дані в файлах реаналіза зберігаються у вигляді цілих чисел, які займають набагато менше місця ніж числа з плаваючою комою. Робиться це для того, щоб файли були менше. Щоб отримати температуру, потрібно перетворити ці дані нехитрим способом.

Якщо ви подивіться на атрибути для змінної air. отримані за допомогою ncdisp. то побачите там:

add_offset = 513
scale_factor = 0.01

Для того, щоб отримати дані в Кельвіна, потрібно помножити все на scale_factor і додати add_offset.

Ви можете просто взяти ці цифри з опису файлу, або витягнути їх за допомогою наступних команд:

add_off = netcdf. getAtt # 40; ncid, 3. 'add_offset' # 41;
scale_factor = netcdf. getAtt # 40; ncid, 3. 'scale_factor' # 41;

На жаль, просто так помножити і додати не вийде. Якщо ви зараз спробуєте виконати цю операцію, то отримаєте наступну помилку:

Integers can only be combined with integers of the same class. or scalar doubles.

Справа в тому, що тип змінної data зараз int16 і на числа з плаваючою комою вони множитися не хочуть. Необхідно перевести дані в тип single

data_single = single # 40; data # 41; ;

Насправді можна це зробити вже при копіюванні даних з змінної netCDF в змінну Матлаб. Далі переводимо в Кельвіна:

data_scaled = # 40; data_single * scale_factor # 41; + Add_off;

.. якщо потрібно, в Цільсій

data_cel = data_scaled- 273.15

Та немає за що. Виглядає цілком стандартно, так що повинно бути все те ж саме. Тільки ясна річ не потрібно до значень нічого додавати і множити, там значення відразу в кельвінах дані.
А чому вирішили саме Матлаб відкривати? Може під язик яким ви користуєтеся є netCDF інтерфейс?

Доброго дня. Хотів би запитати у вас - а як можна знайти температуру і може бути вітер по району Азовського моря?
Тестовий файл netCDF я скачав, але було б дуже цікаво отримати дані по району саме Азовського моря!

Як отримують ці дані по температурі шарів - це все ж інтерполяція, це розрахункові дані. .? Чи вони як то температуру вимірюють саме по верствам?

.? ще питання - Ви перейшли на Python c Matlab з якої причини?
Унаслідок безкоштовності Python?
Мені просто здається що Matlab дуже потужний інструмент, з нього досить складно перейти кудись ще ...

Файл глобальний, тому, звичайно, і Азовське море там теж є. Однак дозвіл даних буде дуже грубе. На сайті NCEP є і вітер і інші характерсітікі атмосфери, але якщо вам потрібен дозвіл побільше, то краще пошукати якісь -або регіональні продукти.

Ці дані отримують шляхом асиміляції даних натурних спостережень в модель циркуляції атмосфери. По суті можна сказати, що це динамічна інетрполяція.

Якщо коротко, то Матлаб інструмент потужний, але не гнучкий, за мінливим світом він не встигає.

Name Size Bytes Class Attributes

data 1 × 1 4 int32

тобто netcdf.getVar дає число - int32. зразок його числом 32767 ніяк не переповнені ...

Стало цікаво - а чому в файлі 75 Кб всього одне число?

32767 - це відсутнє значення, їх в цих файлах повинно бути дофіга. Вам потрібно поміняти їх на NaN.

Не забувайте про офсет і Скейл (наскільки я бачу, щоб отримати правильні значення, вам потрібно просто помножити на 100)

Велике спасибі! Все вийшло. Я просто думав що це помилка якась, аж надто багато відсутніх значень.

Zdrabstbyite!
Pomogite mne pojaluista, kak poluchiti dannie tsentrob deistbii atmosperii iz NCEP reanaliza c togo bremeni do nastoyashego bremeni,

Posting your comment.