1 votos

Extraer con éxito valores de un archivo GRIB2... ¿es posible?

Permítanme decir en primer lugar que estoy empezando a trabajar con archivos GRIB2, he leído los documentos, y más o menos sé cómo están estructurados. Mi objetivo es ser capaz de analizar algunos archivos GRIB2 de la NOAA, más concretamente, los del modelo WaveWatch III. Así que, por favor, perdonad mi ignorancia si algo de lo que digo suena demasiado ingenuo :D

No estoy apegado a ninguna tecnología, aunque me siento cómodo con Java y Python. Para ser más preciso, puedes encontrar el archivo GRIB2 que estoy usando como muestra en esto enlace .

También estoy utilizando el ToolsUI de Unidata para una inspección más "amigable" del archivo GRIB2. Como se puede ver, hay algunas variables en el GRIB2 proporcionado, pero sólo estoy interesado en 2 de ellos:

Dirección_del_viento_desde_qué_superficie_sopla Dirección_del_viento_de_las_ondas_secuencia_ordenada_de_datos

Hasta ahora, he probado este código, que se basa en esto pregunta y puedo abrir el archivo GRIB2:

Grib2Input grib2Input;
String pathfile = "glw.grl.WDIR.grb2";

//Create RandomAccessFile
ucar.unidata.io.RandomAccessFile gribfile = null;
    try {
    gribfile = new ucar.unidata.io.RandomAccessFile(pathfile, "rw");
} 
catch (IOException e) {
    e.printStackTrace();
}

//Create grib2Input file
grib2Input = new Grib2Input(gribfile);
Grib2Data gd = new Grib2Data(gribfile);
try {
    grib2Input.scan(false,  false);
    List<Grib2Record> records = grib2Input.getRecords();
    float[] data = null;
    for (int i = 0; i < records.size(); i++){
        //First get record information   
    System.out.println("record " + i +  "-> Param. Categ.: " +   records.get(i).getPDS().getPdsVars().getParameterCategory());
    System.out.println("record " + i +  "-> Param. Number: " + records.get(i).getPDS().getPdsVars().getParameterNumber());
    try {
    data = gd.getData(records.get(i).getGdsOffset(),records.get(i).getPdsOffset(), records.get(i).getId().getRefTime());
    } 
catch (Exception e) {
    e.printStackTrace();
}
//Second print some data
for (int j = 0; j < 50000; j+=5000){
    System.out.println("data[" + j + "] -> " + data[j]);
}

System.out.println("--");
}

} catch (IOException e) { e.printStackTrace(); }

Ahora la salida, para los 2 primeros registros, es esta:

record 0-> Param. Categ.: 2
record 0-> Param. Number: 0
data[0] -> NaN
data[5000] -> 64.34
data[10000] -> NaN
data[15000] -> NaN
data[20000] -> 38.13
data[25000] -> NaN
data[30000] -> NaN
data[35000] -> NaN
data[40000] -> 66.55
data[45000] -> 107.06
--
record 1-> Param. Categ.: 0
record 1-> Param. Number: 7
data[0] -> NaN
data[5000] -> NaN
data[10000] -> NaN
data[15000] -> NaN
data[20000] -> NaN
data[25000] -> NaN
data[30000] -> NaN
data[35000] -> NaN
data[40000] -> NaN
data[45000] -> 328.5

Bueno, aquí está mi pregunta:

1.- ¿Hay alguna forma mejor de hacer esto con la librería NetCDF-Java? Me parece que para GRIBS de mayor tamaño este método va a tardar siglos. Además, debería eliminar todos los valores NaN de la matriz de datos para cada registro

2.- ¿Debería optar por bibliotecas más específicas de GRIB2 como pygrib o pynio ? Si es así... ¿algún ejemplo práctico de análisis sintáctico de archivos GRIB2 con ellos?

3.- También he probado a utilizar wgrib2 herramienta de línea de comandos... como... generar un archivo CSV con esa herramienta y luego analizar el archivo CSV. La cosa es que el archivo CSV generado tampoco es muy completo

¡¡¡Gracias!!! Alejandro

EDIT: Puedes encontrar una respuesta a esto (usando Python, difícil) aquí . También debo decir que pude hacer esto también usando Netcdf4Java, aunque con GRIB-API de ECMWF es mucho más simple.

0 votos

¿Ha probado la solución GDAL mencionada en esta otra pregunta en gis.stackexchange.com/questions/19543/ ? Parece hacer el trabajo

0 votos

Hola, no, pero realmente no quiero generar un archivo CSV a menos que sea absolutamente necesario ... de hecho, prefiero no usar wgrib2 en absoluto ... el uso de programas externos de línea de comandos es siempre un problema, especialmente cuando se despliega en máquinas remotas con muy diferente configuración como mi máquina de desarrollo ... Pensé que tener NetCDF Java, pygrib y pynio shoudl suffice para analizar un archivo GRIB2 :)

0 votos

¿Esta pregunta ha quedado superada por su otra pregunta sobre el uso del ECMWF?

2voto

Ricardo Reyes Puntos 3428

He trabajado bastante con archivos GRIB, y puedo decir que los archivos GRIB de gran tamaño son ineficaces para analizar puntos individuales.

La razón por la que son ineficientes es que son archivos binarios ingenuos, en el sentido de que no hay cabecera e índice globales (a diferencia de NetCDF) y, por tanto, para averiguar qué capas o pasos temporales hay en un archivo, el software tiene que recorrer todo el archivo para encontrarlos todos.

El programa de línea de comandos cdo se utiliza con frecuencia en la comunidad científica, y tiene una forma de hacer la inspección, como cdo sinfov <filename> . También puede obtener rápidamente otra información resumida.

Para el manejo real de archivos y la extracción de datos mediante programación, considero que la biblioteca NetCDF4 para Python es mucho mejor. Es muy fácil, está bien documentado y es rápido (al leer archivos NetCDF).

1voto

gisdev_p Puntos 121

Utilizo la biblioteca Java GRIB2Tools, véase https://github.com/philippphb/GRIB2Tools . Es fácil de usar y funciona bien y con buen rendimiento para archivos GRIB2 mundiales con cuadrícula de 0,125x0,125 grados, que tienen un tamaño de unos 8 MB.

0voto

1046136 Puntos 6

Utilizar Grib.Api en C# (NuGet)

using (GribFile grbin = new GribFile(gribFile))
{
    GribMessage umsg = grbin.Where(m => m.ParameterShortName.Equals("10u")).First();
    List ulist = umsg.GridCoordinateValues.ToList();
    grbin.Dispose();
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X