Téléchargez des cubes de données Sentinel-1 et Sentinel-2 à grande échelle (plus grands que la mémoire) sur n'importe quelle machine avec détection des nuages, masquage de la neige, harmonisation, fusion et composites temporels intégrés.
Ce package est testé avec Python 3.12.*. Cela peut fonctionner ou non avec d’autres versions.
pip install sentle
ou
git clone [email protected]:cmosig/sentle.git
cd sentle
pip install -e .
Processus
Il n'y a qu'une seule fonction importante : process
. Ici, vous spécifiez tous les paramètres nécessaires au téléchargement et au traitement. Une fois cette fonction appelée, elle commence immédiatement à télécharger et à traiter les données que vous avez spécifiées dans un fichier zarr.
from sentle import sentle
from rasterio.crs import CRS
sentle.process(
zarr_store="mycube.zarr",
target_crs=CRS.from_string("EPSG:32633"),
bound_left=176000,
bound_bottom=5660000,
bound_right=216000,
bound_top=5700000,
datetime="2022-06-17/2023-06-17",
target_resolution=10,
S2_mask_snow=True,
S2_cloud_classification=True,
S2_cloud_classification_device="cuda",
S1_assets=["vv", "vh"],
S2_apply_snow_mask=True,
S2_apply_cloud_mask=True,
time_composite_freq="7d",
num_workers=10,
)
Ce code télécharge des données pour une zone de 40 km sur 40 km avec un an de Sentinel-1 et Sentinel-2. Les nuages et la neige sont détectés et remplacés par des NaN. Les données sont également moyennées tous les 7 jours.
Tout est parallélisé sur 10 travailleurs et chaque travailleur enregistre immédiatement ses résultats dans le chemin spécifié vers un zarr_store
. Cela garantit que vous pouvez télécharger des cubes plus grands que la mémoire.
Explication:
zarr_store
: Enregistrer le chemin.target_crs
: Spécifie le CRS cible vers lequel toutes les données seront reprojetées.target_resolution
: Détermine la résolution spatiale à laquelle toutes les données sont reprojetées dans target_crs
.bound_*
: Limites spatiales dans target_crs
de la zone que vous souhaitez télécharger. Comportement non défini si la différence entre les limites opposées n'est pas divisible par target_resolution
.datetime
: plage horaire qui sera téléchargée.S2_mask_snow
: s'il faut calculer le masque de neige pour les données Sentinel-2.S2_cloud_classification
: s'il faut effectuer une couche de classification cloud pour les données Sentinel-2.S2_cloud_classification_device
: où exécuter la classification cloud. Si vous avez un GPU Nvidia, passez cuda
sinon cpu
(par défaut).S2_apply_*
: S'il faut appliquer le masque respectif, c'est-à-dire remplacer les valeurs par NaN.S1_assets
: quels actifs Sentinel-1 télécharger. Désactivez Sentinel-1 en le définissant sur None
.time_composite_freq
: intervalle d'arrondi sur lequel les données sont moyennées. Utilise pandas.Timestamp.round(time_composite_freq)
. Les masques de nuages/neige sont supprimés après le masquage car ils ne peuvent pas être agrégés.num_workers
: Nombre de cœurs à utiliser. Prévoyez environ 2 Gio d'utilisation de la mémoire par travailleur. -1 signifie tous les cœurs.processing_spatial_chunk_size
: taille des morceaux spatiaux traités en parallèle. La valeur par défaut est 4 000.overwrite
: s'il faut écraser le magasin zarr s'il existe déjà. La valeur par défaut est Faux.Visualiser
Chargez les données avec xarray.
import xarray as xr
da = xr.open_zarr("mycube.zarr").sentle
da
Et visualisez en utilisant le génial package lexcube. Ici, la bande B02 est visualisée à partir de l'exemple ci-dessus. On peut repérer les trouées nuageuses et la couverture inégale en hiver.
import lexcube
lexcube.Cube3DWidget(da.sel(band="B02"), vmin=0, vmax=4000)
Augmentez le nombre de travailleurs à l'aide du paramètre num_workers
lors de la configuration de la classe Sentle
. Avec une taille de bloc spatial par défaut de 4 000, spécifiée par processing_spatial_chunk_size
, vous devez prévoir 2 Gio par travailleur.
Veuillez soumettre des problèmes ou des demandes d'extraction si vous pensez que quelque chose manque ou doit être corrigé.
Ce projet est sous licence MIT - voir le fichier LICENSE.md pour plus de détails.