GRIB конвертация

Не знаете, где задать вопрос? Задавайте здесь.
racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

GRIB конвертация

Сообщение racing1063 » 19 ноя 2022, 08:10

Здраствуйте. Не могу вытянуть данные из GRIB для Excel, работаю из под Windows 10. Установил Wgrib2, но застопорился на командах. Может ли кто-то описать подробно шаг действий?
UPD
Благодарю gamm и tikhpetr за помощь. Эта страница одна из первых в гугле при поиске конвертации GRIB. По этому я немного буду её дополнять по мере решения задачи, если конечно админы не против. Авось кому то поможет.
Оказывается софт открывающий напрямую netcdf в excel существует. Он очень легкий в пользовании, правда придется потрудиться с координатами и временем. http://netcdf4excel.github.io/ Можно ещё с Panoply вытянуть CSV, но учтите, что там таблица вся в один рядок.
Последний раз редактировалось racing1063 22 ноя 2022, 07:50, всего редактировалось 1 раз.

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 19 ноя 2022, 13:21

1) Ёксель - зла (тем более для растров)
2) Wgrib2 - что конкретно и в какой среде используется?
3) У GRIB несколько редакций формата, упомянутая библиотека работает только с одним

racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 19 ноя 2022, 14:49

gamm писал(а):
19 ноя 2022, 13:21
1) Ёксель - зла (тем более для растров)
2) Wgrib2 - что конкретно и в какой среде используется?
3) У GRIB несколько редакций формата, упомянутая библиотека работает только с одним
1) Решил использовать Excel начальном этапе.
2) wgrib2 v3.0.2 3/2021. Пробовал ещё CDO поставить, но с ним возникли проблемы. Wgrib2 получилось через cygwin запустить. Но не могу подобрать правильные команды для открытия Grib файла и конвертации.
3) Исходные данные брал с https://cds.climate.copernicus.eu/cdsap ... s?tab=form
GRIB2, там есть ещё возможность NetCDF.

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 19 ноя 2022, 17:44

ответа на п.2 непонятный. Утилита в командной строке?

Вообще, GRIB формат старый и потому мутный, лучше NetCDF использовать, он более распространен, его почти все читать умеют (это HDF на самом деле). И утилиты под него попадались, на джаве, они от системы не зависят.

racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 19 ноя 2022, 18:11

gamm писал(а):
19 ноя 2022, 17:44
лучше NetCDF использовать
Не подскажите одну из этих программ, желательно что бы гайд на неё был.
По п.2 wgrib2 работает через эмулятор линукс-среды cygwin. То есть там командная строка от Линукса.

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 19 ноя 2022, 18:54

racing1063 писал(а):
19 ноя 2022, 18:11
Не подскажите одну из этих программ
я их не помню, я GRIB сам парсил много лет назад на С++. Поискал, не нашел, давно это было, лет 20 прошло ... кстати, в win10 есть встроенный линух, там еще попробуйте. И смотрите, чтобы ни в именах, ни в путях, не было русских букв.

P.S. Из более-менее свежего нашел, что в R есть библиотека ncdf4, я ее использовал для NetCDF (не GRIB). Но поскольку коперникус меня не пускает, попробовать файлы оттуда не могу. Ниже пример чтения netcdf в R, вытаскивает матрицу по имени, имена выводит print.

Код: Выделить всё

library(ncdf4)
ncin <- nc_open(ncfname)
print(ncin)

lon <- ncvar_get(ncin,"Longitude")
(nlon <- dim(lon))
str(lon)

nc_close(ncin)

tikhpetr
Гуру
Сообщения: 1081
Зарегистрирован: 30 окт 2014, 16:33
Репутация: 153
Откуда: г. Жуковский МО

Re: GRIB конвертация

Сообщение tikhpetr » 20 ноя 2022, 05:05

racing1063, Здравствуйте! М.б., выложите Ваши данные. Есть одна мысль.

racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 20 ноя 2022, 14:08


racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 20 ноя 2022, 16:23

gamm писал(а):
19 ноя 2022, 18:54
R есть библиотека ncdf4
На командах застопорился, не могли бы подробнее объяснить. Сам .nc файл вроде считало, но эти команды не получается
gamm писал(а):
19 ноя 2022, 18:54
Вложения
Безымянный.png
Безымянный.png (145.88 КБ) 1359 просмотров

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 20 ноя 2022, 17:07

racing1063 писал(а):
20 ноя 2022, 16:23
На командах застопорился, не могли бы подробнее объяснить
для начала вместо картинок скопируйте текстовый выхлоп из окна консоли (там через правую кнопку, выделить, скопировать, и вставьте вставьте как код, чтобы простыня не получилась - см. мое сообщение).
Результат

Код: Выделить всё

R version 3.4.4 (2018-03-15) -- "Someone to Lean On"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R -- это свободное ПО, и оно поставляется безо всяких гарантий.
Вы вольны распространять его при соблюдении некоторых условий.
Введите 'license()' для получения более подробной информации.

R -- это проект, в котором сотрудничает множество разработчиков.
Введите 'contributors()' для получения дополнительной информации и
'citation()' для ознакомления с правилами упоминания R и его пакетов
в публикациях.

Введите 'demo()' для запуска демонстрационных программ, 'help()' -- для
получения справки, 'help.start()' -- для доступа к справке через браузер.
Введите 'q()', чтобы выйти из R.

> library(ncdf4)
> 
> ncfname<-"d:/temp/adaptor.mars.internal-1668940949.9105413-16986-18-9f9ad303-bce8-4d2e-a660-58d7e98b87ec.nc"
> ncin <- nc_open(ncfname)
> print(ncin)
File d:/temp/adaptor.mars.internal-1668940949.9105413-16986-18-9f9ad303-bce8-4d2e-a660-58d7e98b87ec.nc (NC_FORMAT_64BIT):

     6 variables (excluding dimension variables):
        short r[longitude,latitude,time]   
            scale_factor: 0.00172804588455364
            add_offset: 59.8856196463387
            _FillValue: -32767
            missing_value: -32767
            units: %
            long_name: Relative humidity
            standard_name: relative_humidity
        short q[longitude,latitude,time]   
            scale_factor: 2.9330351547337e-07
            add_offset: 0.0100701366633867
            _FillValue: -32767
            missing_value: -32767
            units: kg kg**-1
            long_name: Specific humidity
            standard_name: specific_humidity
        short crwc[longitude,latitude,time]   
            scale_factor: 8.59284454420678e-09
            add_offset: 0.000281553144335479
            _FillValue: -32767
            missing_value: -32767
            units: kg kg**-1
            long_name: Specific rain water content
        short t[longitude,latitude,time]   
            scale_factor: 0.00078075227843224
            add_offset: 284.287451420736
            _FillValue: -32767
            missing_value: -32767
            units: K
            long_name: Temperature
            standard_name: air_temperature
        short u[longitude,latitude,time]   
            scale_factor: 0.000702461718952665
            add_offset: -0.0815279886719763
            _FillValue: -32767
            missing_value: -32767
            units: m s**-1
            long_name: U component of wind
            standard_name: eastward_wind
        short v[longitude,latitude,time]   
            scale_factor: 0.00075380462315384
            add_offset: 1.00058440139936
            _FillValue: -32767
            missing_value: -32767
            units: m s**-1
            long_name: V component of wind
            standard_name: northward_wind

     3 dimensions:
        longitude  Size:73
            units: degrees_east
            long_name: longitude
        latitude  Size:33
            units: degrees_north
            long_name: latitude
        time  Size:1830
            units: hours since 1900-01-01 00:00:00.0
            long_name: time
            calendar: gregorian

    2 global attributes:
        Conventions: CF-1.6
        history: 2022-11-20 10:42:57 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data6/adaptor.mars.internal-1668940949.9105413-16986-18-9f9ad303-bce8-4d2e-a660-58d7e98b87ec.nc /cache/tmp/9f9ad303-bce8-4d2e-a660-58d7e98b87ec-adaptor.mars.internal-1668940468.0099413-16986-29-tmp.grib
> var.lon <- ncvar_get(ncin,"longitude")
> (dim.lon <- dim(var.lon))
[1] 73
> str(var.lon)
 num [1:73(1d)] 22 22.2 22.5 22.8 23 ...
> var.lat <- ncvar_get(ncin,"latitude")
> (dim.lat <- dim(var.lat))
[1] 33
> str(var.lat)
 num [1:33(1d)] 52 51.8 51.5 51.2 51 ...
> var.r <- ncvar_get(ncin,"r")
> (dim.r <- dim(var.r))
[1]   73   33 1830
> str(var.r)
 num [1:73, 1:33, 1:1830] 84 83.9 83.6 84 85 ...
> lon.pos = var.lon
> lat.pos = rev(var.lat)
> val.mtr = var.r[,length(var.lat):1,1]
> image(lon.pos,lat.pos,val.mtr,main="Relative humidity",xlab="lon",ylab="lat",asp=1)
> nc_close(ncin)
> 
собственно код

Код: Выделить всё

library(ncdf4)

ncfname<-"d:/temp/adaptor.mars.internal-1668940949.9105413-16986-18-9f9ad303-bce8-4d2e-a660-58d7e98b87ec.nc"
ncin <- nc_open(ncfname)
print(ncin)
var.lon <- ncvar_get(ncin,"longitude")
(dim.lon <- dim(var.lon))
str(var.lon)
var.lat <- ncvar_get(ncin,"latitude")
(dim.lat <- dim(var.lat))
str(var.lat)
var.r <- ncvar_get(ncin,"r")
(dim.r <- dim(var.r))
str(var.r)
lon.pos = var.lon
lat.pos = rev(var.lat)
val.mtr = var.r[,length(var.lat):1,1]
image(lon.pos,lat.pos,val.mtr,main="Relative humidity",xlab="lon",ylab="lat",asp=1)
nc_close(ncin)
картинка
Буфер обмена-1.jpg
Буфер обмена-1.jpg (28.81 КБ) 1352 просмотра

racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 20 ноя 2022, 17:42

gamm, получилось! Только как теперь это экспортировать у csv таблицу.

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 20 ноя 2022, 18:11

1. Зачем ???
2. tmp=as.double(mtr) #в один столбец
3. write.table(mtr,"foo.csv",sep=";") # как матрицу

racing1063
Новоприбывший
Сообщения: 11
Зарегистрирован: 19 ноя 2022, 07:59
Репутация: 0
Откуда: Mars

Re: GRIB конвертация

Сообщение racing1063 » 20 ноя 2022, 19:11

gamm, без "mtr" получилось, но я не понял куда записало csv файл.
> write.table("foo.csv",sep=";") # как матрицу
"x"
"1";"foo.csv"
С mtr не хочет, выдаёт ошибку
> write.table(mtr,"foo.csv",sep=";") # как матрицу
Error in is.data.frame(x) : object 'mtr' not found

tikhpetr
Гуру
Сообщения: 1081
Зарегистрирован: 30 окт 2014, 16:33
Репутация: 153
Откуда: г. Жуковский МО

Re: GRIB конвертация

Сообщение tikhpetr » 20 ноя 2022, 19:49

racing1063, У меня полное фиаско! GM в кататонический цикл, пытаясь открывать одно и то же. Увы!

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: GRIB конвертация

Сообщение gamm » 20 ноя 2022, 20:16

gamm, без "mtr" получилось, но я не понял куда записало csv файл.
> write.table("foo.csv",sep=";") # как матрицу
"x"
"1";"foo.csv"
С mtr не хочет, выдаёт ошибку
mtr - это матрица, которую нужно сохранить. Исходник трехмерный, долгота, шгирота, время. Я в примере брал двумерное сечение с фиксированным временем, остается долгота и широта. Под mtr понимается это сечение, если брать пример, то нужно присвоить
mtr = val.mtr

сохраняется в файл foo.csv, путь пропишите куда надо, поумолчанию в Документы (посмотрите выхлоп команды getwd())
> write.table(mtr,"foo.csv",sep=";") # как матрицу
Error in is.data.frame(x) : object 'mtr' not found
ясное дело не нашла, имелось в виду нужное сечение нужного массива, массивов там много, все надписаны (см. выхлоп print).
Файлы csv с разделителем ; открываются Ёкселем (после двойного чук-чук левой кнопкой мышки).

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей