/* grib2.h : décodeur GRIB édition 2, limité à ce dont la chaîne a besoin. * * Gère : grille 3.0 (latitude-longitude régulière), produits 4.0 et 4.8, section 6 (bitmap), * emballages 5.0 (simple), 5.3 (complexe avec différenciation spatiale, GFS) et 5.42 (CCSDS, * décompressé par libaec). Tout le reste est refusé proprement. * Chaque longueur lue dans le fichier est bornée par ce qui reste du tampon. */ #ifndef AUSTEN_GRIB2_H #define AUSTEN_GRIB2_H #include #include typedef struct { int discipline, category, number; /* identité du paramètre (tables OMM) */ int pdt; /* modèle de produit : 0 ou 8 */ int surface, stat_proc; /* type de surface fixe ; traitement statistique (-1 si aucun) */ double surface_value; int64_t ref_time, valid_time; /* epoch UTC ; validité = fin d'intervalle pour 4.8 */ int ni, nj, scan; /* points en i (longitude) et j (latitude), mode de balayage */ double la1, lo1, la2, lo2, di, dj; /* degrés */ int drt, bits; /* modèle de représentation des données, bits par valeur */ double *values; /* ni*nj dans l'ordre du fichier, NaN = manquant */ } G2Field; /* Décode le message qui commence à *pos (ou le suivant). Retourne 1 si un champ a été lu, * 0 en fin de tampon, -1 en cas d'erreur (message dans err). *pos avance au message suivant. * want(discipline, category, number, ctx) permet de ne dépaqueter que les champs utiles * (NULL = tous) ; un champ ignoré est rendu avec values = NULL. */ typedef int (*g2_filter)(int discipline, int category, int number, void *ctx); int g2_next(const uint8_t *buf, size_t len, size_t *pos, G2Field *f, g2_filter want, void *ctx, char *err, size_t errlen); void g2_free(G2Field *f); #endif