Vincent GODARD - V1- 11/03/2022
Inspiré de :
Sources :
données ESA (https://www.esa.int/ESA_Multimedia/Images/2017/03/Sentinel-2_global_coverage)
(en cours)
Avant de pouvoir de télécharger des données Sentinelsat, il faut s'identifier sur le site de Copernicus Open Access Hub (https://scihub.copernicus.eu/dhus/#/home) avec un username et un password (à établir dans Sign up). À faire avant de poursuivre !
# Chargement des bibliothèques (library)
!pip install sentinelsat
!pip install rasterio
!pip install folium
!apt install gdal-bin python-gdal python3-gdal
!apt install python3-rtree
!pip install git+git://github.com/geopandas/geopandas.git
!pip install descartes
# Import des bibliothèques
import folium
import os
import numpy as np
from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import MultiPolygon, Polygon
import rasterio as rio
from rasterio.plot import show
import rasterio.mask
import fiona
# Préparation du login pour accéder au service
user = 'votre nom'
password = 'votre mot de passe'
api = SentinelAPI(user, password, 'https://scihub.copernicus.eu/dhus')
Pour utiliser l'API de sélection et téléchargement des données, il existe plusieurs moyens pour indiquer les limites de la zone d'étude. Celui que nous allons utiliser ici consiste à dessiner un quadrilatère autour de notre zone d'intérêt qui va servir à délimiter notre zone de recherche dans la base de données.
Nous allons réaliser un shpfile en coordonnées géographiques autour de l'Île d'Yeu.
# Décompression des polygones autours de la ZofI (zone of interest (: !))
!unzip '/content/data/polygon_shp.zip' # Préférez les .zip aux .7z pour une décompression directe !
# Lecture et description du polygone stricts
polygon_s = gpd.read_file('/content/polygon_strict.shp')
polygon_s
# Affichage de la zone d'étude centrée sur l'île d'Yeu
Yeu = folium.Map([46.78 , -2.44], zoom_start=11)
folium.GeoJson(polygon_s).add_to(Yeu)
Yeu
Avec le code ci-dessus nous avons lu le shp du polygone strict autour de l'île d'Yeu dans GeoPandas. Nous avons ensuite créé une carte dans Folium centrée sur l'île d'Yeu sur laquelle nous avons affiché le polygone centré sur notre ZofI.
Dernière étape avant de chercher puis charger les données satellitales Sentinel 2, la création d'une "empreinte" à partir du polygone strict autour de l'île d'Yeu. Nos allons utiliser la bibliothèque Python Shapely pour récupérer la Geometry de la couche des Shapefiles précédemment transformée en GeodataFrame par Geopandas. Notons que si notre couche avait été en données Geojson, Sentinelsat mettait directement à notre disposition un convertisseur pour effectuer les requêtes de recherche d'images.
footprint = None
for i in polygon_s['geometry']:
footprint = i
footprint
Nous allons maintenant lancer la requête au travers de l'API précédemment paramétrée. Il existe plein de façons de faire. Dans cet exemple, notre requête porte sur les données Sentinel 2 de niveau 2A (Level 2A) avec un couvert nuageux (cloud coverage) compris en 0 et 10 p.100 qui intersecte l'empreinte (ZofI). Pour la période temporelle, nous allons dans un premier temps favoriser le début de l'automne entre le '20210901' et '20210930' (pour en savoir plus sur les "bonnes" périodes de prises de vues, vous pouvez faire un peu de biblio sur scihub).
products = api.query(footprint,
date = ('20210901', '20210930'),
platformname = 'Sentinel-2',
processinglevel = 'Level-2A',
cloudcoverpercentage = (0,10))
On obtient une liste des images correspondant à notre requête.
Combien d'images cela représente-t-il ?
# nombre d'images retenues
len(products)
Nous allons importer un GeodataFrame à partir de notre liste et la trier par pourcentage de couvert nuageux.
products_gdf = api.to_geodataframe(products)
products_gdf_sorted = products_gdf.sort_values(['cloudcoverpercentage'], ascending=[True])
products_gdf_sorted
Si nous sommes intéressés par la première date, il suffit maintenant de la télécharger en indiquant son nom. Si on les veut toute, il suffit de l'indiquer comme suit : api.download_all()), mais attention, c'est du lourd !
Cela va prendre un peu de temps selon votre connexion (une scène Sentinel 2 Satellite "pèse" environ 1 GB). Une fois le téléchargement réalisé, il n'y a plus qu'à déziper !
# api.download("4b8b906d-5f95-4d87-964a-f134c593b6d9")
/!\ La suite est en travaux /!\