Utilisation API EDR¶
L'api est mise à disposition par géosas : https://api.geosas.fr/edr/collections/
Exemple de téléchargement de données par l'API EDR¶
Import des librairies
import requests
import pandas as pd
import xarray as xr
import seaborn as sns
import matplotlib.pyplot as plt
Récupération des informations du service de téléchargement
url_service = "https://api.geosas.fr/edr/collections/safran-isba/"
r = requests.get(url_service)
if r.ok:
print("requete ok")
data_info = r.json()
else:
print("erreur code :", r.status_code)
data_info = None
requete ok
Affichage de l'identifiant (name) des parametres disponible sur le service
for name, parametre in data_info["parameter_names"].items():
print(f"{name} : {parametre["description"]}")
DLI_Q : Rayonnement atmosphérique (cumul quotidien) DRAINC_Q : Drainage (cumul quotidien 06-06 UTC) ETP_Q : Evapotranspiration potentielle (formule de Penman-Monteith) FF_Q : Vent (moyenne quotidienne) HU_Q : Humidité relative (moyenne quotidienne) PRELIQ_Q : Précipitations liquides (cumul quotidien 06-06 UTC) PRENEI_Q : Précipitations solide (cumul quotidien 06-06 UTC) SSI_Q : Rayonnement visible (cumul quotidien) SWI_Q : Indice d'humidité des sols (moyenne quotidienne 06-06 UTC) TINF_H_Q : Température minimale des 24 températures horaires TSUP_H_Q : Température maximale des 24 températures horaires T_Q : Température (moyenne quotidienne)
Exemple pour une coordonnées xy¶
On veut télécharger les températures moyennes du mois de juillet 2022 au point de coordonnées X=349598 Y=6798263 en projection Lambert 93 (EPSG:2154) au format CoverageJson
#on peut en téléchager plusieurs à la fois :
#parametre='T_Q,PRELIQ_Q'
param_name = "T_Q"
coord = "POINT(349598 6798263)"
projection = "EPSG:2154"
formatage = "CoverageJSON"
date = "2022-07-01/2022-07-31"
url = "https://api.geosas.fr/edr/collections/safran-isba/position"
params = {
"coords": coord,
"crs": projection,
"parameter-name": param_name,
"f": formatage,
"datetime": date
}
r = requests.get(url, params=params)
print(r.request.url)
if r.ok:
print("requête ok")
data = r.json()
else:
print(f"erreur code : {r.status_code}")
https://api.geosas.fr/edr/collections/safran-isba/position?coords=POINT%28349598+6798263%29&crs=EPSG%3A2154¶meter-name=T_Q&f=CoverageJSON&datetime=2022-07-01%2F2022-07-31 requête ok
date_value = data["domain"]["axes"]["t"]["values"]
values = data["ranges"][param_name]["values"]
print("Exemple de date pour définir le format:", date_value[0])
Exemple de date pour définir le format: 2022-07-01T00-00-00Z
Affichage des informations du jeu de données
df = pd.DataFrame()
df[param_name] = values
df["date"] = pd.to_datetime(date_value, format="%Y-%m-%dT%H-%M-%SZ")
df.head()
T_Q | date | |
---|---|---|
0 | 15.400000 | 2022-07-01 |
1 | 17.100000 | 2022-07-02 |
2 | 16.100000 | 2022-07-03 |
3 | 16.100000 | 2022-07-04 |
4 | 16.799999 | 2022-07-05 |
Exemple de plot avec récupération de métadonnées utiles
for name, parametre in data_info["parameter_names"].items():
if name == param_name:
unit_label = parametre["observedProperty"]["label"]
unit_symbol = parametre["unit"]["symbol"]["value"]
description = parametre["description"]
fig, ax = plt.subplots(figsize=(12, 6))
sns.lineplot(data=df, x="date", y=param_name, ax=ax)
ax.tick_params(axis="x", labelrotation=45)
ax.set_title(description, size=16)
ax.set_xlabel("Date", size=14)
ax.set_ylabel(f"{unit_label} ({unit_symbol})", size=14)
break
Exemple pour récuperer un cube de données sur une zone¶
Je veux télécharger l’évapotranspiration potentielle, les précipitations liquides et la température de 2020 à 2023 pour l’ensemble de la Bretagne définie géographiquement par son coin inférieur gauche (X=90000,Y=6693915) et son coin supérieur droit (X=410874,Y=6902748) en projection Lambert 93 (EPSG:2154), au format NetCDF :
url = "https://api.geosas.fr/edr/collections/safran-isba/cube"
param_name = "ETP_Q,PRELIQ_Q,T_Q"
box = "90000,6693915,410874,6902748"
projection = "EPSG:2154"
formatage = "NetCDF4"
date = "2020-01-01/2023-12-31"
params = {
"bbox": box,
"crs": projection,
"parameter-name": param_name,
"f": formatage,
"datetime": date
}
r = requests.get(url, params=params)
if r.ok:
print("requête ok")
print(r.request.url)
else:
print("erreur code :", r.status_code)
requête ok https://api.geosas.fr/edr/collections/safran-isba/cube?bbox=90000%2C6693915%2C410874%2C6902748&crs=EPSG%3A2154¶meter-name=ETP_Q%2CPRELIQ_Q%2CT_Q&f=NetCDF4&datetime=2020-01-01%2F2023-12-31
Lecture du fichier reçu par xarray
data=xr.open_dataset(r.content)
data
#Si l'on veut continuer en utilisant pandas :
#df = data.to_dataframe
<xarray.Dataset> Size: 18MB Dimensions: (time: 1461, y: 27, x: 38) Coordinates: * time (time) datetime64[ns] 12kB 2020-01-01 2020-01-02 ... 2023-12-31 * x (x) float64 304B 1.103e+05 1.183e+05 ... 3.981e+05 4.061e+05 * y (y) float64 216B 6.903e+06 6.895e+06 ... 6.703e+06 6.695e+06 Data variables: ETP_Q (time, y, x) float32 6MB ... PRELIQ_Q (time, y, x) float32 6MB ... T_Q (time, y, x) float32 6MB ... spatial_ref int32 4B ... Attributes: description: Données quotidiennes du modèle de simulation des schémas de... id: safran-isba title: Safran-Isba, Données changement climatique - SIM quotidienne crs: EPSG:2154 rel: https://www.etalab.gouv.fr/licence-ouverte-open-licence/
Visualisation des attributs d'un parametère
data.T_Q.attrs
{'description': 'Température (moyenne quotidienne)', 'observedProperty': 'http://opendata.inrae.fr/thesaurusINRAE/c_1243', 'type': 'Parameter', 'unit': '°C', 'unit label': 'degrée Celcius'}
fig, ax = plt.subplots()
data.T_Q.mean("time").plot(ax=ax)
ax.set_title("Moyenne des températures moyennes quotidiennes", size=14)
Text(0.5, 1.0, 'Moyenne des températures moyennes quotidiennes')
fig, ax = plt.subplots()
data.T_Q.plot.hist(ax=ax)
ax.set_title("Histogramme des températures moyennes quotidiennes", size=14)
Text(0.5, 1.0, 'Histogramme des températures moyennes quotidiennes')
print(f"Valeur moyenne sur toute la période : {data.T_Q.mean().data:.1f}°C")
Valeur moyenne sur toute la période : 12.5°C
Exemple de filtre
fig, ax = plt.subplots()
data1 = data.sel({"time": slice("2022-07-01", "2022-07-31")})
data1.PRELIQ_Q.sum("time").plot.hist(ax=ax)
ax.set_title(
"Répartition de la somme des précipitations liquides\npar maille safran en Bretagne en juillet 2022");