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

In [1]:
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

In [2]:
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

In [3]:
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

In [4]:
#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&parameter-name=T_Q&f=CoverageJSON&datetime=2022-07-01%2F2022-07-31
requête ok
In [5]:
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

In [6]:
df = pd.DataFrame()
df[param_name] = values
df["date"] = pd.to_datetime(date_value, format="%Y-%m-%dT%H-%M-%SZ")
df.head()
Out[6]:
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

In [7]:
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
No description has been provided for this image

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 :

In [8]:
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&parameter-name=ETP_Q%2CPRELIQ_Q%2CT_Q&f=NetCDF4&datetime=2020-01-01%2F2023-12-31

Lecture du fichier reçu par xarray

In [9]:
data=xr.open_dataset(r.content)
data

#Si l'on veut continuer en utilisant pandas :
#df = data.to_dataframe
Out[9]:
<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/
xarray.Dataset
    • time: 1461
    • y: 27
    • x: 38
    • time
      (time)
      datetime64[ns]
      2020-01-01 ... 2023-12-31
      array(['2020-01-01T00:00:00.000000000', '2020-01-02T00:00:00.000000000',
             '2020-01-03T00:00:00.000000000', ..., '2023-12-29T00:00:00.000000000',
             '2023-12-30T00:00:00.000000000', '2023-12-31T00:00:00.000000000'],
            dtype='datetime64[ns]')
    • x
      (x)
      float64
      1.103e+05 1.183e+05 ... 4.061e+05
      axis :
      X
      long_name :
      x coordinate of projection
      standard_name :
      projection_x_coordinate
      units :
      metre
      array([110287.554727, 118281.896115, 126276.237504, 134270.578892,
             142264.920281, 150259.261669, 158253.603058, 166247.944446,
             174242.285834, 182236.627223, 190230.968611, 198225.31    ,
             206219.651388, 214213.992777, 222208.334165, 230202.675554,
             238197.016942, 246191.35833 , 254185.699719, 262180.041107,
             270174.382496, 278168.723884, 286163.065273, 294157.406661,
             302151.748049, 310146.089438, 318140.430826, 326134.772215,
             334129.113603, 342123.454992, 350117.79638 , 358112.137769,
             366106.479157, 374100.820545, 382095.161934, 390089.503322,
             398083.844711, 406078.186099])
    • y
      (y)
      float64
      6.903e+06 6.895e+06 ... 6.695e+06
      axis :
      Y
      long_name :
      y coordinate of projection
      standard_name :
      projection_y_coordinate
      units :
      metre
      array([6902769.349383, 6894775.007995, 6886780.666607, 6878786.325218,
             6870791.98383 , 6862797.642441, 6854803.301053, 6846808.959664,
             6838814.618276, 6830820.276887, 6822825.935499, 6814831.594111,
             6806837.252722, 6798842.911334, 6790848.569945, 6782854.228557,
             6774859.887168, 6766865.54578 , 6758871.204391, 6750876.863003,
             6742882.521615, 6734888.180226, 6726893.838838, 6718899.497449,
             6710905.156061, 6702910.814672, 6694916.473284])
    • ETP_Q
      (time, y, x)
      float32
      ...
      description :
      Evapotranspiration potentielle (formule de Penman-Monteith)
      observedProperty :
      http://opendata.inrae.fr/thesaurusINRAE/c_241
      type :
      Parameter
      unit :
      mm
      unit label :
      millimetre
      [1498986 values with dtype=float32]
    • PRELIQ_Q
      (time, y, x)
      float32
      ...
      description :
      Précipitations liquides (cumul quotidien 06-06 UTC)
      observedProperty :
      http://opendata.inrae.fr/thesaurusINRAE/c_11627
      type :
      Parameter
      unit :
      mm
      unit label :
      millimetre
      [1498986 values with dtype=float32]
    • T_Q
      (time, y, x)
      float32
      ...
      description :
      Température (moyenne quotidienne)
      observedProperty :
      http://opendata.inrae.fr/thesaurusINRAE/c_1243
      type :
      Parameter
      unit :
      °C
      unit label :
      degrée Celcius
      [1498986 values with dtype=float32]
    • spatial_ref
      ()
      int32
      ...
      crs_wkt :
      PROJCS["RGF93 v1 / Lambert-93",GEOGCS["RGF93 v1",DATUM["Reseau_Geodesique_Francais_1993_v1",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","2154"]]
      semi_major_axis :
      6378137.0
      semi_minor_axis :
      6356752.314140356
      inverse_flattening :
      298.257222101
      reference_ellipsoid_name :
      GRS 1980
      longitude_of_prime_meridian :
      0.0
      prime_meridian_name :
      Greenwich
      geographic_crs_name :
      RGF93 v1
      horizontal_datum_name :
      Reseau Geodesique Francais 1993 v1
      projected_crs_name :
      RGF93 v1 / Lambert-93
      grid_mapping_name :
      lambert_conformal_conic
      standard_parallel :
      [49. 44.]
      latitude_of_projection_origin :
      46.5
      longitude_of_central_meridian :
      3.0
      false_easting :
      700000.0
      false_northing :
      6600000.0
      spatial_ref :
      PROJCS["RGF93 v1 / Lambert-93",GEOGCS["RGF93 v1",DATUM["Reseau_Geodesique_Francais_1993_v1",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","2154"]]
      GeoTransform :
      106290.38403273735 7994.341388438262 0.0 6906766.520077598 0.0 -7994.341388438262
      [1 values with dtype=int32]
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
                     '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
                     '2020-01-09', '2020-01-10',
                     ...
                     '2023-12-22', '2023-12-23', '2023-12-24', '2023-12-25',
                     '2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29',
                     '2023-12-30', '2023-12-31'],
                    dtype='datetime64[ns]', name='time', length=1461, freq=None))
    • x
      PandasIndex
      PandasIndex(Index([110287.55472695648, 118281.89611539475,   126276.237503833,
             134270.57889227127, 142264.92028070954,  150259.2616691478,
             158253.60305758606,  166247.9444460243,  174242.2858344626,
             182236.62722290086,  190230.9686113391, 198225.30999977735,
             206219.65138821563,  214213.9927766539, 222208.33416509215,
              230202.6755535304, 238197.01694196867, 246191.35833040695,
              254185.6997188452, 262180.04110728344, 270174.38249572174,
                278168.72388416, 286163.06527259824,  294157.4066610365,
              302151.7480494748, 310146.08943791303,  318140.4308263513,
              326134.7722147895, 334129.11360322783,  342123.4549916661,
              350117.7963801043, 358112.13776854257,  366106.4791569809,
              374100.8205454191, 382095.16193385737,  390089.5033222956,
              398083.8447107339, 406078.18609917216],
            dtype='float64', name='x'))
    • y
      PandasIndex
      PandasIndex(Index([6902769.349383379, 6894775.007994941, 6886780.666606503,
             6878786.325218065, 6870791.983829626, 6862797.642441188,
              6854803.30105275, 6846808.959664311, 6838814.618275873,
             6830820.276887435, 6822825.935498997, 6814831.594110559,
              6806837.25272212, 6798842.911333682, 6790848.569945244,
             6782854.228556805, 6774859.887168367, 6766865.545779929,
             6758871.204391491, 6750876.863003053, 6742882.521614614,
             6734888.180226176, 6726893.838837737, 6718899.497449299,
             6710905.156060861, 6702910.814672423, 6694916.473283985],
            dtype='float64', name='y'))
  • description :
    Données quotidiennes du modèle de simulation des schémas de surface (Safran - Isba). Paramètres atmosphériques de surface et bilans des sols en points de grille issus de l'analyse de modèle simulant les flux d’eau et d’énergie à la surface terrestre.
    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

In [10]:
data.T_Q.attrs
Out[10]:
{'description': 'Température (moyenne quotidienne)',
 'observedProperty': 'http://opendata.inrae.fr/thesaurusINRAE/c_1243',
 'type': 'Parameter',
 'unit': '°C',
 'unit label': 'degrée Celcius'}
In [11]:
fig, ax = plt.subplots()
data.T_Q.mean("time").plot(ax=ax)
ax.set_title("Moyenne des températures moyennes quotidiennes", size=14)
Out[11]:
Text(0.5, 1.0, 'Moyenne des températures moyennes quotidiennes')
No description has been provided for this image
In [12]:
fig, ax = plt.subplots()
data.T_Q.plot.hist(ax=ax)
ax.set_title("Histogramme des températures moyennes quotidiennes", size=14)
Out[12]:
Text(0.5, 1.0, 'Histogramme des températures moyennes quotidiennes')
No description has been provided for this image
In [21]:
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

In [14]:
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");
No description has been provided for this image