LogoLogo
✉️ Contact💬 Forum
Guides de data.gouv.fr
Guides de data.gouv.fr
  • Bienvenue
  • ❓Foire aux questions
  • Documentation de data.gouv.fr
    • Créer un compte utilisateur et rejoindre une organisation
    • Organisation
      • Créer une organisation
      • Suivre l'activité et modifier son organisation
      • Gérer les membres de son organisation
      • Certifier une organisation
      • Supprimer une organisation
    • Jeux de données
      • Publier un jeu de données
        • Publier une Base Adresse Locale
      • Gérer un jeu de données
      • Explorer un jeu de donnée
      • Télécharger le catalogue de données de data.gouv.fr
      • Accéder au catalogue via SPARQL
    • API
      • Publier une API
      • Gérer une API
      • Outils pour les administrations
        • Doctrine des API
        • Accompagnement humain
        • Datapass : Outil d'habilitations
        • Bouquets API Entreprise et API Particulier
    • Réutilisations
      • Publier une réutilisation
      • Gérer une réutilisation
    • Statistiques
    • Ressource communautaire
    • Moissonnage
      • Comprendre les limites du moissonnage
      • Les différents types de moissonneurs
      • Mettre en place un moissonneur
      • Analyser le rapport de moissonnage
      • Moissonnage des plateformes géographiques
    • API de data.gouv.fr
      • Prise en main de l'API
      • Tutoriel d'utilisation
      • Gérer un jeu de données par l'API
      • Référence
        • site
        • datasets
        • reuses
        • discussions
        • organizations
        • spatial
        • users
        • me
        • contacts
        • workers
        • tags
        • topics
        • posts
        • transfer
        • notifications
        • avatars
        • harvest
  • Guides open data
    • Guide juridique
      • Producteurs de données
        • Comprendre la notion d'open data
        • Qui est concerné ?
        • Quelles sont les obligations ?
      • Réutilisateurs de données
        • Respecter les conditions de réutilisation
      • Chronologie de l'open data
    • Guide qualité
      • Evaluer le niveau de qualité d'un jeu de données
      • Préparer un jeu de données de qualité
        • Extraire un jeu de données d'un système d'information
        • Structurer un jeu de données
          • Structurer une Base Adresse Locale
        • Lier des données à un référentiel
      • Documenter des données
        • Bien documenter un jeu de données
        • Diffuser la documentation d'un jeu de données
      • Améliorer la qualité d'un jeu de données en continu
        • Améliorer le score de qualité des métadonnées
        • Connaître et suivre les usages d'un jeu de données
        • Mettre en place une stratégie organisationnelle
      • Maîtriser les schémas de données
        • Comprendre les bénéfices d'utiliser un schéma de données
        • Créer un schéma de données
          • Etape 1 : Phase d'investigation
          • Etape 2 : Phase de concertation
          • Etape 3 : Phase de construction
          • Etape 4 : Phase de promotion et de maintien
          • Focus : Construire un schéma TableSchema
        • Intégrer un schéma de données à schema.data.gouv.fr
        • Produire des données en conformité avec un schéma
        • Indiquer et vérifier qu'une ressource respecte un schéma de données
  • Guides sur l'utilisation des données
    • Introduction à l'open data
      • Comprendre la notion d'open data
      • Comprendre l'écosystème de l'open data
      • Comprendre les conditions d'utilisation des données en open data
      • Découvrir et utiliser data.gouv.fr
    • Guide traitement et analyse de données
      • Trouver des données
      • Prendre connaissance et évaluer la qualité de données
      • Explorer des données
      • Récupérer des données
      • Manipuler des données
        • Ouvrir des données
        • Filtrer des données
        • Nettoyer des données
        • Croiser des données
        • Géocoder des adresses
      • Analyser des données
        • Analyser des données avec le tableur LibreOffice Calc
        • Analyser des données avec Python
        • Analyser des données avec R
      • Visualiser des données
      • Cartographier des données
      • Réaliser des projets utiles et s'inspirer
      • Poser des questions aux producteurs de données
      • Valoriser ses travaux
      • Autres ressources pédagogiques
    • Guide API géographiques
      • Utiliser l'API Adresse
        • Rappel sur les données adresses
        • Géocoder des adresses - théorie
        • Géocoder des adresses - cas pratiques
        • FAQ Adresse
      • Utiliser l'API Découpage administratif
      • Utiliser les tuiles vectorielles
    • Guide données du cadastre
      • Comprendre les données du cadastre et leurs usages
      • Manipuler les données du cadastre
      • Foire aux questions sur le cadastre
    • Guide données météorologiques
    • Guide API "Adresse" de l'IGN
  • Autres ressources utiles
    • Lexique de l'open data
    • Données de la commande publique
      • Publier les données essentielles d’attribution des marchés
      • Déclaration d’un profil d’acheteur
    • Données de forte valeur : métadonnées obligatoires et modalités de rapportage
    • Ressources OpenDataFrance
    • Documentation de transport.data.gouv.fr
    • Les algorithmes publics : pourquoi et comment les expliquer ?
      • Les algorithmes publics : enjeux et obligations
      • Fiche pratique : l'obligation de mention explicite
      • Fiche pratique : l'inventaire des principaux traitements algorithmiques
      • Liste de ressources
    • Codes sources du secteur public : lesquels ouvrir, pourquoi et comment ?
      • Ce document n'est pas...
      • Cadre juridique
    • Catalogage de données - GRIST
    • 📒Guide du participant au Hackathon Météo
      • Ressources du hackathon
        • Données
        • Prise en main des données
        • Outils
        • Programme
        • Informations pratiques
        • Contacts
      • Avant le hackathon
      • Pendant le hackathon : règles et bonnes pratiques
        • Choix du défi
        • Constitution des équipes
        • Sollicitation des mentors
        • Documentation des réalisations
        • Rendu intermédiaire
        • Soumission du projet
        • Evaluation des projets
      • Après le hackathon
        • Evaluation du hackathon
        • Valorisation de votre projet
Propulsé par GitBook
Sur cette page
  • Récupérer les données météorologiques en utilisant l’API de data.gouv.fr
  • Lister les ressources et les jeux de données d'une organisation
  • Récupérer les jeux de données d'un dataset
  • Récupérer les id des organisations ("organizations") ou des jeux de données ("datasets")
  • Le "raccourci" possible
  • meteo.data.gouv.fr : les "topics"
  • Utiliser les données météorologiques
  • Manipuler les formats de fichiers grib2
  • Mettre les données en bases de données
  • Manipuler les données : quelques outils
  • Utiliser les API de Météo-France

Cet article vous a-t-il été utile ?

Modifier sur GitHub
Exporter en PDF
  1. Autres ressources utiles
  2. Guide du participant au Hackathon Météo
  3. Ressources du hackathon

Prise en main des données

PrécédentDonnéesSuivantOutils

Dernière mise à jour il y a 21 jours

Cet article vous a-t-il été utile ?

Récupérer les données météorologiques en utilisant l’API de data.gouv.fr

est souvent uniquement assimilé à un site web. Or, il permet aussi :

  • de moissonner des ressources distantes comme des catalogues ;

  • de consulter via une API les pages, les jeux de données associés à des pages, les organisations, leurs jeux de données, les réutilisations, etc.

  • de mettre à jour les jeux de données via l'API.

Il existe une référence à ce propos sur . Un guide est disponible sur https://guides.data.gouv.fr/guide-data.gouv.fr/api.

Pour le hackathon nous vous avons préparé un dépôt github contenant des utilitaires vous permettant de télécharger les données.

Vous trouverez ci-dessous des exemples plus génériques vous expliquant en détail comment télécharger les données sur la plateforme data.gouv.fr. Nos exemples sont réalisés soit en ligne de commande en Bash, soit en Python. Pour les exemples Bash, il faut disposer de , , et installés sur votre machine.

Lister les ressources et les jeux de données d'une organisation

On cible ici Météo-France.

En bash, on passe en CSV.


# Nous trichons un peu : nous savons qu'il n'y a que 106 jeux de données pour le moment et cela nous évite de paginer ici.
curl '<https://www.data.gouv.fr/api/1/organizations/534fff8ba3a7292c64a77ed4/datasets/?page=1&page_size=200>' | jq . >| meteo-france-organization.json
echo '"ds_id","ds_title","ds_page","id","title","format","filetype","mime","type","url"' >| datasets_organization_meteo_france.csv
jq -r '.data[] | .page as $ds_page | .title as $ds_title| .id as $ds_id | .resources[] | [$ds_id, $ds_title, $ds_page, .id, .title, .format, .filetype, .mime, .["type"], .url] | @csv' meteo-france-organization.json >> datasets_organization_meteo_france.csv

En Python, on récupère les données.

import csv
import urllib.request
import json

start = 1
page_size = 10
organization_id = '534fff8ba3a7292c64a77ed4'
api_url = f'<https://www.data.gouv.fr/api/1/organizations/{organization_id}/datasets/?page={start}&page_size={page_size}>'

def get_all_organisations_datasets(initial_url):
    api_url = initial_url
    data = []
    while api_url is not None:
        with urllib.request.urlopen(api_url) as resp:
            response_json = json.load(resp)
        api_url = response_json.get('next_page')
        data = data + response_json.get('data')
    return data

results = get_all_organisations_datasets(api_url)

infos = []
field_names = ["ds_id","ds_title","ds_page","id","title","format","filetype","mime","type","url"]
infos.append(field_names)
for result in results:
    ds_id = result.get('id')
    ds_title = result.get('title')
    ds_page = result.get('page')
    for resource in result.get('resources'):
        infos.append([
            ds_id,
            ds_title,
            ds_page,
            resource.get('id'),
            resource.get('title'),
            resource.get('format'),
            resource.get('filetype'),
            resource.get('mime'),
            resource.get('type'),
            resource.get('url')
        ])

with open('datasets_organization_meteo_france.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL)
    writer.writerows(infos)

print(len(results))

Inconvénient : il est mis à jour tous les jours, cette fréquence bien qu'importante ne convient pas forcément à tous les utilisateurs.

Avantage : les fichiers sont exploitables via des logiciels de type tableur

url_catalogue=$(curl <https://www.data.gouv.fr/api/1/datasets/5d13a8b6634f41070a43dff3/> | jq -r '.resources[] | select(.title | startswith("export-resource"))| .url')

wget $url_catalogue
local_file=$(echo "${url_catalogue##*/}")
xsv search -d ';' -s "dataset.organization_id" '534fff8ba3a7292c64a77ed4' $local_file >| datasets_organization_meteo_france_from_catalogue.csv
xsv search -d ';' -s "dataset.organization" 'Météo-France' $local_file >| datasets_organization_meteo_france_from_catalogue_alt.csv

Récupérer les jeux de données d'un dataset

En Bash


curl https://www.data.gouv.fr/api/1/datasets/6569b4473bedf2e7abad3b72/ | jq -r '.resources[] | select(.type != "documentation")| .url'

En Python

import urllib.request
import json

dataset_id = '6569b4473bedf2e7abad3b72'
url = f'<https://www.data.gouv.fr/api/1/datasets/{dataset_id}/>'

# Start of datasets infos ressources retrieval
with urllib.request.urlopen(url) as resp:
    json_content = json.load(resp)

urls = [resource.get('url') for resource in json_content.get('resources') if resource.get('type') != 'documentation']
print(urls)

Récupérer les id des organisations ("organizations") ou des jeux de données ("datasets")

Pour récupérer les id des organisations

  1. Cherchez l'organisation Météo-France et rendez-vous sur sa page ;

  2. Allez dans l'onglet "Informations" ;

Vous pouvez réexploiter cette id via une URL du type https://www.data.gouv.fr/api/1/organizations/534fff8ba3a7292c64a77ed4/datasets/?page=1&page_size=10 pour l'organisation 534fff8ba3a7292c64a77ed4

Il existe pour les organisations un système de pagination. Ainsi, il faut vérifier si dans le retour de l'URL précédente si next_page contient une URL. Il faut alors l'appeler et répéter l'opération autant de fois que nécessaire.

Pour récupérer les id des jeux de données

  1. Rendez-vous dans l'onglet "Informations" pour retrouver l'id du jeu de données.

Le "raccourci" possible

Nous avons tendance à préférer les identifiants techniques mais un autre moyen plus rapide est de passer le slug de la page ou de l'organisation.

Le slug correspond à du texte qui s'appuie sur le titre de l'organisation ou du jeu de données en remplaçant les espaces par des tirets et les lettres accentuées en lettres sans accents avec des minuscules partout dans l'URL.

meteo.data.gouv.fr : les "topics"

  • Données climatologiques de base

  • Données climatologiques de référence pour le changement climatique

  • Données de prévision numérique du temps (PNT)

Boucler sur les topics

>| topics.ndjson
url="<https://www.data.gouv.fr/api/1/topics/?page=1&page_size=10>"
while true ; do
  result=$(curl -s $url);
  echo $result | jq -r -c .data[] >> topics.ndjson
  url=$(echo $result | jq -r -c .next_page)
  echo $url
  if [[ $(echo $result | jq '.next_page') == 'null' ]];
    then break; # Exit the loop
  fi;
done;
jq -c -r --slurp '.[] | .page as $to_page | .name as $to_name | .id as $to_id | .datasets[] | [$to_id, $to_name, $to_page, .id, .title, .page, .uri] | @csv' topics.ndjson
jq -r -c '. | [.id, .name] | @csv' topics.ndjson

Ainsi, on a la correspondance suivante :

"65e0c82c2da27c1dff5fa66f","Données de Prévision Numérique du Temps (PNT)"
"6571f2db0273fc306408f265","Données climatologiques de référence pour le changement climatique"
"6571f26dc009674feb726be9","Données climatologiques de base"
topic_ids_meteo=("65e0c82c2da27c1dff5fa66f" "6571f2db0273fc306408f265" "6571f26dc009674feb726be9")

echo "to_id,to_name,to_page,id,title,page,uri" >| topics_datasets.csv
for id in ${topic_ids_meteo[@]};
  do echo "<https://www.data.gouv.fr/api/1/topics/${id}/>";
     curl "<https://www.data.gouv.fr/api/1/topics/${id}/>" | jq -c -r '.page as $to_page | .name as $to_name | .id as $to_id | .datasets[] | [$to_id, $to_name, $to_page, .id, .title, .page, .uri] | @csv' >> topics_datasets.csv
done;

Utiliser les données météorologiques

Les formats de données météorologiques sont des formats multidimensionnels, en particulier pour les données liées aux satellites car ils nécessitent de gérer les coordonnées soit ponctuelles soit associées à une grille (déjà 2 dimensions), des dates d'acquisition (une autre dimension) et des mesures diverses (encore une dimension).

Manipuler les formats de fichiers grib2

Inspection en Bash

wget <https://object.data.gouv.fr/meteofrance-pnt/pnt/2024-04-02T12:00:00Z/arome/001/HP1/arome__001__HP1__01H__2024-04-02T12:00:00Z.grib2>
# On va généralement inspecter avec less ou filtrer avec des outils type grep
gdalinfo arome__001__HP1__01H__2024-04-02T12\\:00\\:00Z.grib2
# On a une sortie JSON potentiellement plus facilement exploitable avec par exemple jq
gdalinfo -json arome__001__HP1__01H__2024-04-02T12\\:00\\:00Z.grib2

Inspection en Python

import pygrib

openpath='arome__001__HP1__01H__2024-04-02T12:00:00Z.grib2'
grbs = pygrib.open(openpath)
grbs.seek(0)
for grb in grbs:
    print(grb)

Pour l'exemple ci-dessous, passez par conda avec conda install --channel conda-forge xarray cfgrib eccodes -y

import numpy as np
import xarray as xr
import matplotlib.pyplot as plt

openpath = 'arome__001__HP1__01H__2024-04-02T12:00:00Z.grib2'
# Below commeneted due to https://github.com/meteofrance/meteonet/issues/20
# ds = xr.open_dataset(openpath,engine='cfgrib',backend_kwargs={'indexpath': ''})
meteodata = xr.open_dataset(openpath, engine='cfgrib',
                            backend_kwargs={'filter_by_keys': {'cfVarName': 'ws'}})
                            backend_kwargs={'filter_by_keys': {'name': 'Relative humidity'}})
print(meteodata['ws'])
ds_heightAboveGround50 = meteodata.sel(heightAboveGround=50)
plt.contourf(ds_heightAboveGround50['ws'])
plt.colorbar()
plt.savefig('ds_heightAboveGround50.png')

Inspection dans QGIS

Mettre les données en bases de données

Cela peut surtout s'avérer utile pour mettre des données attributaires comme les stations ou les mesures associées prises sur les stations. Il est ensuite plus facile de les manipuler si vous avez des connaissances en SQL. Néanmoins, rien ne vous empêche selon vos préférences de faire tous vos traitements dans des dataframes en Python ou en R.

SQLite

C'est un format de fichier qui contient une base de données relationnelle ne nécessitant aucune installation.

En utilisant l’utilitaire sqlite-utils, installable via pip install sqlite-utils

sqlite-utils insert meteo_hor.db meteo_hor <(zcat H_01_1850-1859.csv.gz) --delimiter=";”

Pour exploiter le fichier généré, vous pouvez lancer une commande du type

sqlite-utils query meteo_hor.db "SELECT * FROM meteo_hor" --csv

GPKG

C'est un format qui s'appuie sur la base de données SQLite. La particularité est qu'il permet de gérer de la donnée géographique en intégrant des fonctionnalités spatiales du type "recherche toutes stations à moins de 10 km de chez moi".

ogr2ogr -f GPKG meteo_hor.gpkg -dialect SQLite -sql "SELECT *, MakePoint(cast(LON AS REAL), cast(LAT AS REAL), 4326) AS geometry FROM \"H_01_latest-2023-2024\"" /vsigzip/H_01_latest-2023-2024.csv.gz -nln csv_hor
# Une alternative à l'exemple ci-dessus de passer une fichier pour la requête SQL
# qui évite d'avoir à échapper les guillemets
# Editer le fichier query.sql avec le contenu suivant
# SELECT *, MakePoint(cast(LON AS REAL), cast(LAT AS REAL), 4326) AS geometry FROM "H_01_latest-2023-2024"
ogr2ogr -f GPKG meteo_hor.gpkg -dialect SQLite -sql @query.sql /vsigzip/H_01_latest-2023-2024.csv.gz -nln csv_hor

Parquet

Ce format permet des sélections rapides même en passant par des fichiers distants, évitant par exemple des téléchargements complets sur votre machine. Il existe une variation dite GeoParquet qui permet de stocker les données géographiques.

ogr2ogr -f Parquet meteo_hor.parquet -dialect SQLite -sql "SELECT *, MakePoint(cast(LON AS REAL), cast(LAT AS REAL), 4326) AS geometry FROM \"H_01_latest-2023-2024\"" /vsigzip/H_01_latest-2023-2024.csv.gz

La différence notable est que la taille du GPKG généré est de l’ordre de 20 fois plus gros que le fichier GeoParquet.

PostgreSQL/PostGIS

PostgreSQL est une base de données client/serveur. Elle nécessite une installation sur votre machine ou un serveur distant. Elle peut gérer de très gros volumes de données, étant en concurrence avec des SGBD type Oracle ou MySQL Server.

Si vous manipulez de la donnée géographique, vous ne pourrez pas passer à côté de sa cartouche spatiale PostGIS qui est à ce jour la meilleure du marché dans les SGBD existants.

Charger les données dans PostgreSQL avec le client psql (fourni dès l'installation de PostgreSQL/PostGIS) en ligne de commande

# Les types pourraient être améliorés dans le CREATE TABLE...
# Attention, on passe ici par un service pour la connexion mais il est possible de
# passer la connexion à la base via une connexion de la forme suivante
# psql 'postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName'
psql service=meteo -c "CREATE TABLE IF NOT EXISTS csv_meteo_hor(NUM_POSTE text, NOM_USUEL text, LAT double precision, LON double precision, ALTI integer, AAAAMMJJHH bigint, RR1 text, QRR1 integer, DRR1 text, QDRR1 integer, FF text, QFF integer, DD text, QDD integer, FXY text, QFXY integer, DXY text, QDXY integer, HXY text, QHXY integer, FXI text, QFXI integer, DXI text, QDXI integer, HXI text, QHXI integer, FF2 text, QFF2 integer, DD2 text, QDD2 integer, FXI2 text, QFXI2 integer, DXI2 text, QDXI2 integer, HXI2 text, QHXI2 integer, FXI3S text, QFXI3S integer, DXI3S text, QDXI3S integer, HFXI3S text, QHFXI3S integer, T text, QT integer, TD text, QTD integer, TN text, QTN integer, HTN text, QHTN integer, TX text, QTX integer, HTX text, QHTX integer, DG text, QDG integer, T10 text, QT10 integer, T20 text, QT20 integer, T50 text, QT50 integer, T100 text, QT100 integer, TNSOL text, QTNSOL integer, TN50 text, QTN50 integer, TCHAUSSEE text, QTCHAUSSEE integer, DHUMEC text, QDHUMEC integer, U text, QU integer, UN text, QUN integer, HUN text, QHUN integer, UX text, QUX integer, HUX text, QHUX integer, DHUMI40 text, QDHUMI40 integer, DHUMI80 text, QDHUMI80 integer, TSV text, QTSV integer, PMER text, QPMER integer, PSTAT text, QPSTAT integer, PMERMIN text, QPERMIN integer, GEOP text, QGEOP integer, N text, QN integer, NBAS text, QNBAS integer, CL text, QCL integer, CM text, QCM integer, CH text, QCH integer, N1 text, QN1 integer, C1 text, QC1 integer, B1 text, QB1 integer, N2 text, QN2 integer, C2 text, QC2 integer, B2 text, QCB2 integer, N3 text, QN3 integer, C3 text, QC3 integer, B3 text, QB3 integer, N4 text, QN4 integer, C4 text, QC4 integer, B4 text, QB4 integer, VV text, QVV integer, DVV200 text, QDVV200 integer, WW text, QWW integer, W1 text, QW1 integer, W2 text, QW2 integer, SOL text, QSOL integer, SOLNG text, QSOLNG integer, TMER text, QTMER integer, VVMER text, QVVMER integer, ETATMER text, QETATMER integer, DIRHOULE text, QDIRHOULE integer, HVAGUE text, QHVAGUE integer, PVAGUE text, QPVAGUE integer, HNEIGEF text, QHNEIGEF integer, NEIGETOT text, QNEIGETOT integer, TSNEIGE text, QTSNEIGE integer, TUBENEIGE text, QTUBENEIGE integer, HNEIGEFI3 text, QHNEIGEFI3 integer, HNEIGEFI1 text, QHNEIGEFI1 integer, ESNEIGE text, QESNEIGE integer, CHARGENEIGE text, QCHARGENEIGE integer, GLO text, QGLO integer, GLO2 text, QGLO2 integer, DIR text, QDIR integer, DIR2 text, QDIR2 integer, DIF text, QDIF integer, DIF2 text, QDIF2 integer, UV text, QUV integer, UV2 text, QUV2 integer, UV_INDICE text, QUV_INDICE integer, INFRAR text, QINFRAR integer, INFRAR2 text, QINFRAR2 integer, INS text, QINS integer, INS2 text, QINS2 integer, TLAGON text, QTLAGON integer, TVEGETAUX text, QTVEGETAUX integer, ECOULEMENT text, QECOULEMENT integer);"
zcat H_01_1850-1859.csv.gz | psql service=meteo -c "COPY csv_meteo_hor (NUM_POSTE, NOM_USUEL, LAT, LON, ALTI, AAAAMMJJHH, RR1, QRR1, DRR1, QDRR1, FF, QFF, DD, QDD, FXY, QFXY, DXY, QDXY, HXY, QHXY, FXI, QFXI, DXI, QDXI, HXI, QHXI, FF2, QFF2, DD2, QDD2, FXI2, QFXI2, DXI2, QDXI2, HXI2, QHXI2, FXI3S, QFXI3S, DXI3S, QDXI3S, HFXI3S, QHFXI3S, T, QT, TD, QTD, TN, QTN, HTN, QHTN, TX, QTX, HTX, QHTX, DG, QDG, T10, QT10, T20, QT20, T50, QT50, T100, QT100, TNSOL, QTNSOL, TN50, QTN50, TCHAUSSEE, QTCHAUSSEE, DHUMEC, QDHUMEC, U, QU, UN, QUN, HUN, QHUN, UX, QUX, HUX, QHUX, DHUMI40, QDHUMI40, DHUMI80, QDHUMI80, TSV, QTSV, PMER, QPMER, PSTAT, QPSTAT, PMERMIN, QPERMIN, GEOP, QGEOP, N, QN, NBAS, QNBAS, CL, QCL, CM, QCM, CH, QCH, N1, QN1, C1, QC1, B1, QB1, N2, QN2, C2, QC2, B2, QCB2, N3, QN3, C3, QC3, B3, QB3, N4, QN4, C4, QC4, B4, QB4, VV, QVV, DVV200, QDVV200, WW, QWW, W1, QW1, W2, QW2, SOL, QSOL, SOLNG, QSOLNG, TMER, QTMER, VVMER, QVVMER, ETATMER, QETATMER, DIRHOULE, QDIRHOULE, HVAGUE, QHVAGUE, PVAGUE, QPVAGUE, HNEIGEF, QHNEIGEF, NEIGETOT, QNEIGETOT, TSNEIGE, QTSNEIGE, TUBENEIGE, QTUBENEIGE, HNEIGEFI3, QHNEIGEFI3, HNEIGEFI1, QHNEIGEFI1, ESNEIGE, QESNEIGE, CHARGENEIGE, QCHARGENEIGE, GLO, QGLO, GLO2, QGLO2, DIR, QDIR, DIR2, QDIR2, DIF, QDIF, DIF2, QDIF2, UV, QUV, UV2, QUV2, UV_INDICE, QUV_INDICE, INFRAR, QINFRAR, INFRAR2, QINFRAR2, INS, QINS, INS2, QINS2, TLAGON, QTLAGON, TVEGETAUX, QTVEGETAUX, ECOULEMENT, QECOULEMENT) FROM STDIN WITH DELIMITER ';' CSV HEADER;"
psql service=meteo -c "SELECT AddGeometryColumn('public','csv_meteo_hor','geom',4326,'POINT',2);"
psql service=meteo -c "UPDATE csv_meteo_hor SET geom = ST_SetSRID(ST_MakePoint(LON, LAT), 4326)"
psql service=meteo -c "CREATE TABLE IF NOT EXISTS stations_meteo_hor AS SELECT DISTINCT num_poste, nom_usuel, lat, lon, alti FROM csv_meteo_hor;"
psql service=meteo -c "SELECT AddGeometryColumn('public','stations_meteo_hor','geom',4326,'POINT',2);"
psql service=meteo -c "UPDATE stations_meteo_hor SET geom = ST_SetSRID(ST_MakePoint(LON, LAT), 4326)"

PostgreSQL/PostGIS - Python avec Psycopg2

import gzip
import psycopg2

# Possibility 1: use PGSERVICE. Use PGPASSFILE also PGSERVICEFILE
# export PGSERVICE=geodata
# with psycopg2.connect() as conn:
# connexion string is of the form postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName
connexion = 'postgres://user:password@localhost:5432/meteo'
create_table = """CREATE TABLE IF NOT EXISTS csv_meteo_hor(NUM_POSTE text, NOM_USUEL text, LAT double precision, LON double precision, ALTI integer, AAAAMMJJHH bigint, RR1 text, QRR1 integer, DRR1 text, QDRR1 integer, FF text, QFF integer, DD text, QDD integer, FXY text, QFXY integer, DXY text, QDXY integer, HXY text, QHXY integer, FXI text, QFXI integer, DXI text, QDXI integer, HXI text, QHXI integer, FF2 text, QFF2 integer, DD2 text, QDD2 integer, FXI2 text, QFXI2 integer, DXI2 text, QDXI2 integer, HXI2 text, QHXI2 integer, FXI3S text, QFXI3S integer, DXI3S text, QDXI3S integer, HFXI3S text, QHFXI3S integer, T text, QT integer, TD text, QTD integer, TN text, QTN integer, HTN text, QHTN integer, TX text, QTX integer, HTX text, QHTX integer, DG text, QDG integer, T10 text, QT10 integer, T20 text, QT20 integer, T50 text, QT50 integer, T100 text, QT100 integer, TNSOL text, QTNSOL integer, TN50 text, QTN50 integer, TCHAUSSEE text, QTCHAUSSEE integer, DHUMEC text, QDHUMEC integer, U text, QU integer, UN text, QUN integer, HUN text, QHUN integer, UX text, QUX integer, HUX text, QHUX integer, DHUMI40 text, QDHUMI40 integer, DHUMI80 text, QDHUMI80 integer, TSV text, QTSV integer, PMER text, QPMER integer, PSTAT text, QPSTAT integer, PMERMIN text, QPERMIN integer, GEOP text, QGEOP integer, N text, QN integer, NBAS text, QNBAS integer, CL text, QCL integer, CM text, QCM integer, CH text, QCH integer, N1 text, QN1 integer, C1 text, QC1 integer, B1 text, QB1 integer, N2 text, QN2 integer, C2 text, QC2 integer, B2 text, QCB2 integer, N3 text, QN3 integer, C3 text, QC3 integer, B3 text, QB3 integer, N4 text, QN4 integer, C4 text, QC4 integer, B4 text, QB4 integer, VV text, QVV integer, DVV200 text, QDVV200 integer, WW text, QWW integer, W1 text, QW1 integer, W2 text, QW2 integer, SOL text, QSOL integer, SOLNG text, QSOLNG integer, TMER text, QTMER integer, VVMER text, QVVMER integer, ETATMER text, QETATMER integer, DIRHOULE text, QDIRHOULE integer, HVAGUE text, QHVAGUE integer, PVAGUE text, QPVAGUE integer, HNEIGEF text, QHNEIGEF integer, NEIGETOT text, QNEIGETOT integer, TSNEIGE text, QTSNEIGE integer, TUBENEIGE text, QTUBENEIGE integer, HNEIGEFI3 text, QHNEIGEFI3 integer, HNEIGEFI1 text, QHNEIGEFI1 integer, ESNEIGE text, QESNEIGE integer, CHARGENEIGE text, QCHARGENEIGE integer, GLO text, QGLO integer, GLO2 text, QGLO2 integer, DIR text, QDIR integer, DIR2 text, QDIR2 integer, DIF text, QDIF integer, DIF2 text, QDIF2 integer, UV text, QUV integer, UV2 text, QUV2 integer, UV_INDICE text, QUV_INDICE integer, INFRAR text, QINFRAR integer, INFRAR2 text, QINFRAR2 integer, INS text, QINS integer, INS2 text, QINS2 integer, TLAGON text, QTLAGON integer, TVEGETAUX text, QTVEGETAUX integer, ECOULEMENT text, QECOULEMENT integer)"""

with psycopg2.connect(connexion) as conn:
    cur = conn.cursor()
    cur.execute("""SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema';""")

    for record in cur:
        print(record)
    cur.execute(create_table)
    with gzip.open('H_01_1850-1859.csv.gz','rb') as infile:
        cur.copy_expert("COPY csv_meteo_hor (NUM_POSTE, NOM_USUEL, LAT, LON, ALTI, AAAAMMJJHH, RR1, QRR1, DRR1, QDRR1, FF, QFF, DD, QDD, FXY, QFXY, DXY, QDXY, HXY, QHXY, FXI, QFXI, DXI, QDXI, HXI, QHXI, FF2, QFF2, DD2, QDD2, FXI2, QFXI2, DXI2, QDXI2, HXI2, QHXI2, FXI3S, QFXI3S, DXI3S, QDXI3S, HFXI3S, QHFXI3S, T, QT, TD, QTD, TN, QTN, HTN, QHTN, TX, QTX, HTX, QHTX, DG, QDG, T10, QT10, T20, QT20, T50, QT50, T100, QT100, TNSOL, QTNSOL, TN50, QTN50, TCHAUSSEE, QTCHAUSSEE, DHUMEC, QDHUMEC, U, QU, UN, QUN, HUN, QHUN, UX, QUX, HUX, QHUX, DHUMI40, QDHUMI40, DHUMI80, QDHUMI80, TSV, QTSV, PMER, QPMER, PSTAT, QPSTAT, PMERMIN, QPERMIN, GEOP, QGEOP, N, QN, NBAS, QNBAS, CL, QCL, CM, QCM, CH, QCH, N1, QN1, C1, QC1, B1, QB1, N2, QN2, C2, QC2, B2, QCB2, N3, QN3, C3, QC3, B3, QB3, N4, QN4, C4, QC4, B4, QB4, VV, QVV, DVV200, QDVV200, WW, QWW, W1, QW1, W2, QW2, SOL, QSOL, SOLNG, QSOLNG, TMER, QTMER, VVMER, QVVMER, ETATMER, QETATMER, DIRHOULE, QDIRHOULE, HVAGUE, QHVAGUE, PVAGUE, QPVAGUE, HNEIGEF, QHNEIGEF, NEIGETOT, QNEIGETOT, TSNEIGE, QTSNEIGE, TUBENEIGE, QTUBENEIGE, HNEIGEFI3, QHNEIGEFI3, HNEIGEFI1, QHNEIGEFI1, ESNEIGE, QESNEIGE, CHARGENEIGE, QCHARGENEIGE, GLO, QGLO, GLO2, QGLO2, DIR, QDIR, DIR2, QDIR2, DIF, QDIF, DIF2, QDIF2, UV, QUV, UV2, QUV2, UV_INDICE, QUV_INDICE, INFRAR, QINFRAR, INFRAR2, QINFRAR2, INS, QINS, INS2, QINS2, TLAGON, QTLAGON, TVEGETAUX, QTVEGETAUX, ECOULEMENT, QECOULEMENT) FROM STDIN WITH DELIMITER ';' CSV HEADER;", infile)
    # Dumb here. As there is time series, as much geometry as time.
    # Could report stations in another table
    cur.execute("SELECT AddGeometryColumn('public','csv_meteo_hor','geom',4326,'POINT',2);")
    cur.execute("UPDATE csv_meteo_hor SET geom = ST_SetSRID(ST_MakePoint(LON, LAT), 4326)")
    # Other solution with station in another table
    cur.execute("SELECT AddGeometryColumn('public','stations_meteo_hor','geom',4326,'POINT',2);")
    cur.execute("UPDATE stations_meteo_hor SET geom = ST_SetSRID(ST_MakePoint(LON, LAT), 4326)")

PostgreSQL/PostGIS - Python avec Pandas

Manipuler les données : quelques outils

En ligne de commande

Quelques utilitaires intéressants :

  • Pour récupérer les données : curl/wget

  • Pour manipuler du JSON : jq

  • Pour manipuler du CSV : xsv/csvkit

  • Pour manipuler des données géographiques vecteur ou raster : ogrinfo/ogr2ogr/gdalinfo/gdalwarp fournis par GDAL

  • Pour manipuler des données csv ou passer par du parquet facilement : duckdb

En Python

Pensez à passer par des Notebooks Jupyter. Utilisez conda/mamba et des environnements virtuels

Les bibliothèques qui pourraient vous être utiles :

  • pandas avec son module “géo” geopandas

  • xarray, cfgrib, eccodes pour manipuler les grib2 type Arome ou Arpège

  • matplotlib avec cartopy et basemap

Logiciel SIG QGIS

Pour une analyse visuelle rapide, vous pouvez passer par QGIS qui permet de gérer les WMS, les CSV et les GeoJSON.

Utiliser les API de Météo-France

Après création d’un compte, il est possible souscrire à des APIs. Par défaut, le compte ne permet rien sauf de souscrire à des APIs. Quand on a choisi une API, on peut souscrire puis commencer à utiliser pour son usage.

La page d’accueil du site reproduite ci-dessous est très claire à ce propos.

Exemple avec QGIS

Ajout de WMS Arome

Il est aussi possible de passer par les fichiers du catalogue de données de data.gouv.fr pour obtenir un contenu similaire. Le lien web est :

Il s'agit de pages de jeux de données comme

Passez par ;

Descendez en bas pour voir mentionné l'id comme sur :

Allez sur un jeu de données des "Données climatologiques de base - horaires",

Ensuite, il faudra entrer comme URL avec l'id 6569b4473bedf2e7abad3b72 pour accéder au json des ressources associées au jeu de données.

Pour l'organisation , il suffit de copier la partie meteo-france de l'url et d'ouvrir la page pour avoir le même résultat que .

Pour le jeu de données , les URLs ou sont équivalentes.

Derrière se cache un site dérivé de .

L'API de expose ce que l’on appelle des "topics", qui sont des regroupements de données et qui sont consommés via le front de meteo.data.gouv.fr.

3 topics sont actuellement utilisés sur :

Il est ensuite possible de retrouver les correspondances entre noms des topics sur .

Si on veut toutes les données du portail , voici un recette en bash :

Pour cela, plusieurs formats sont utilisés. On stocke généralement les données brutes sous forme de fichiers dits GRIB, un format standardisé par l'OMM (Organisation Mondiale de la Météorologie). Vous pouvez en savoir plus en passant par .

Pour en savoir plus, lire

L'outil pour facilement manipuler ces fichiers est qui peut être appelé en R, Python, dans le navigateur comme en ligne de commande.

Vous pouvez si nécessaire consulter .

Voir

Un bon point d’entrée pour des exemples (en particulier pour les données type Arome/Arpege) : .

Vous pouvez vous référer pour un tuto rapide à .

Vous pouvez également vous référer à .

Bien que les données soient ouvertes sous licence Etalab, les APIs nécessitent de créer un compte sur (pour éviter les abus et pouvoir suivre les usages).

📒
data.gouv.fr
https://doc.data.gouv.fr/api/reference/
Dépôt Github d'assistance au téléchargement des données météos
curl
wget
jq
xsv
https://www.data.gouv.fr/fr/datasets/catalogue-des-donnees-de-data-gouv-fr/#/resources
https://www.data.gouv.fr/fr/datasets/donnees-climatologiques-de-base-horaires/
data.gouv.fr
https://www.data.gouv.fr/fr/organizations/meteo-france/#/information
https://www.data.gouv.fr/fr/datasets/donnees-climatologiques-de-base-horaires/
https://www.data.gouv.fr/api/1/datasets/6569b4473bedf2e7abad3b72/
https://www.data.gouv.fr/fr/organizations/meteo-france/
https://www.data.gouv.fr/api/1/organizations/meteo-france/datasets/?page=1&page_size=10
https://www.data.gouv.fr/api/1/organizations/534fff8ba3a7292c64a77ed4/datasets/?page=1&page_size=10
https://www.data.gouv.fr/fr/datasets/donnees-climatologiques-de-base-horaires/
https://www.data.gouv.fr/api/1/datasets/donnees-climatologiques-de-base-horaires/
https://www.data.gouv.fr/api/1/datasets/6569b4473bedf2e7abad3b72/
meteo.data.gouv.fr
data.gouv.fr
data.gouv.fr
meteo.data.gouv.fr
meteo.data.gouv.fr
meteo.data.gouv.fr
la page Wikipédia GRIB
la documentation sur la partie ligne de commande
l'outil duckdb
un guide d'installation
https://pandas.pydata.org/docs/user_guide/io.html#insertion-method
https://github.com/meteofrance/meteonet/
https://tutoqgis.cnrs.fr
la documentation officielle du projet QGIS
https://portail-api.meteofrance.fr
Inspection grib2 dans QGIS
Page d'accueil du site des API de Météo-France
Exemple d'ajout de WMS Arome