meteo-melin Posté(e) 18 juillet Partager Posté(e) 18 juillet Bonjour à tous, Certains d'entre-vous ont-ils deja essayé de décoder les données BUFR des radars Meteo France disponibles via l'API? J'ai essayé de décoder avec decbufr 3.2 et les tables fournies par MF mais j'ai plein de missing values dans le fichier docodé. Est-ce que cela vous dit quelque chose? Quelqu'un a-t-il deja converti les tables csv fournies par MF en fichiers compatible avec eccodes? Merci Lien à poster Partager sur d’autres sites More sharing options...
theperk Posté(e) 21 juillet Partager Posté(e) 21 juillet C'est déjà pas mal si tu as réussi à décoder quelque chose avec les tables de MF et le programme decbufr 3.2 😉 Le problème du décodage des données BUFR a notamment été évoqué là : https://forums.infoclimat.fr/f/topic/59033-ouverture-des-données-par-météo-france-au-010124/?page=5# En résumé les tables de MF étaient plus grandes que prévues par la limite du programme donc il était carrément impossible de décoder quoi que ce soit. Perso j'avais fini par faire un programme python dans un notebook pour décoder leurs fichiers : https://github.com/theperk08/Meteo_France_Radars Quant à la conversion des csv en fichiers compatibles avec eccodes, je ne sais pas, je ne me suis pas penché sur ce programme. 1 1 Lien à poster Partager sur d’autres sites More sharing options...
meteo-melin Posté(e) 21 juillet Auteur Partager Posté(e) 21 juillet Oui, j'ai du recompiler decbufr pour prendre en charge des plus gros fichiers. Mais après je n'ai pas su corriger l'espèce d'overwrite qu'il faisait de chaque enregistrement. En gros à la fin, je me retrouvais avec un seul pixel de la matrice radar. J'ai abandonné et j'utilise pybufrkit pour lequel j'ai trouvé des tables partielles que j'ai pu compléter sur base des csv de Meteo-France. Il me reste quelques problèmes à corriger pour superposer une carte (probleme de projection et/ou d'origine) et mon dev sera fonctionnel. 1 Lien à poster Partager sur d’autres sites More sharing options...
_sb Posté(e) 21 juillet Aubagne (13400) Partager Posté(e) 21 juillet Le 18/07/2025 à 16:38, meteo-melin a dit : Quelqu'un a-t-il deja converti les tables csv fournies par MF en fichiers compatible avec eccodes? Je n'utilise pas ecCodes dans ce cadre précisément, je ne saurai pas te répondre. Ceci peut t'aiguiller si tu n'as pas déjà consulté cette page : https://confluence.ecmwf.int/display/UDOC/How+do+I+create+BUFR+from+a+CSV+-+ecCodes+BUFR+FAQ Lien à poster Partager sur d’autres sites More sharing options...
Pan Posté(e) 22 juillet Partager Posté(e) 22 juillet 21 hours ago, meteo-melin said: Oui, j'ai du recompiler decbufr pour prendre en charge des plus gros fichiers. Mais après je n'ai pas su corriger l'espèce d'overwrite qu'il faisait de chaque enregistrement. En gros à la fin, je me retrouvais avec un seul pixel de la matrice radar. J'ai abandonné et j'utilise pybufrkit pour lequel j'ai trouvé des tables partielles que j'ai pu compléter sur base des csv de Meteo-France. Il me reste quelques problèmes à corriger pour superposer une carte (probleme de projection et/ou d'origine) et mon dev sera fonctionnel. Les scripts écrits par Theperk fonctionnnent bien. Tu peux utiliser comme point de départ. Lien à poster Partager sur d’autres sites More sharing options...
meteo-melin Posté(e) 5 août Auteur Partager Posté(e) 5 août Hello à tous, J'ai un peu de mal à aligner correctement un fond de carte sur les données radar de Météo France. J'utilise les paramètres suivants pour la projection: proj_lambert = Proj( proj="lcc", lat_1=45.0, lat_0=45.0, lon_0=0.0, x_0=0, y_0=0, ellps="WGS84", units="m" ) lambert_crs = CRS.from_proj4(proj_lambert.srs) transformer = Transformer.from_crs("EPSG:4326", lambert_crs, always_xy=True) Est-ce correct? Car si je mets l'origine spécifiée dans le BUFR, à savoir 53.67,-9.965, j'ai un décalage sur ma carte. Merci. Lien à poster Partager sur d’autres sites More sharing options...
Picard Posté(e) il y a 9 heures Rabastens Partager Posté(e) il y a 9 heures bonjour @meteo-melin, j'ai réussi à décoder correctement les bufr grâce à la librairie @theperk (un grand merci). Maintenant, comme toi, je me confronte à un pb de localisation des données bufr (IPRN21 ou IMFR27). - la loc dans les IPRN20 en format h5 est correct, dans le sens où j'arrive à générer une grille lon/lat qui matche météociel et que je valide par ailleurs (colloc avec mon pluvio) - la loc des bufr est décalée (*) , quelque soit la solution que j'emploie (et j'ai testé un grand nb de solutions ces derniers jours) j'en suis là (voir le code ci-dessous) mais cette solution est décalée (*) par rapport à IPRN20 (je cherche une précision au km) (*) les cellules de pluie sont décalées si quelqu'un.e à une idée, je suis preneur. Je continue de chercher de mon coté. PS: Est-ce qu'il pourrait y avoir un pb de parallaxe entre IPRN20 et IPRN21 ? datas_messages = lib_bufr.deco_bufr(fname) dm = datas_messages[0] # ~ print('\n'.join(sorted(list(datas_messages[0].keys())))) rows = int(dm["Number of pixels per column"][0]) cols = int(dm["Number of pixels per row"][0]) dx = float(dm["Pixel size on horizontal - 1"][0]) dy = float(dm["Pixel size on horizontal - 2"][0]) lat_ref = float(dm["Latitude de reference"][0]) lon0 = float(dm["Longitude du meridien parallele a l'axe des Y"][0]) ptype = int(dm["Projection type"][0]) # Projection OPERA : LCC (ptype=1) ou Stéréographique (ptype=3) if ptype == 1: projstr = f"+proj=lcc +lat_1=44 +lat_2=49 +lat_0={lat_ref} +lon_0={lon0} +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" elif ptype == 3: projstr = f"+proj=stere +lat_0=90 +lon_0={lon0} +lat_ts={lat_ref} +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" else: raise ValueError(f"Projection type non géré: {ptype}") crs_geo = CRS.from_epsg(4326) crs_proj = CRS.from_proj4(projstr) fwd = Transformer.from_crs(crs_geo, crs_proj, always_xy=True) inv = Transformer.from_crs(crs_proj, crs_geo, always_xy=True) lats = np.asarray(dm["Latitude (high accuracy)"], float) lons = np.asarray(dm["Longitude (high accuracy)"], float) lons = np.where(lons > 180, lons - 360, lons) # Coin UL = (lat max, lon min) parmi les tie-points i_ul = np.argmin((lats - lats.max())**2 + (lons - lons.min())**2) x_ul, y_ul = fwd.transform(lons[i_ul], lats[i_ul]) # ~ DECAL_X = +85 # ~ DECAL_Y = +35 DECAL_X = 0 DECAL_Y = 0 # Grille aux centres de pixels xs = x_ul + (np.arange(cols) + DECAL_X*0.5) * dx ys = y_ul - (np.arange(rows) + DECAL_Y*0.5) * dy # vers le sud XX, YY = np.meshgrid(xs, ys) lon, lat = inv.transform(XX, YY) lon = np.where(lon > 180, lon - 360, lon) Lien à poster Partager sur d’autres sites More sharing options...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant