Descargue cubos de datos Sentinel-1 y Sentinel-2 de gran escala (más grandes que la memoria) en cualquier máquina con detección de nubes integrada, enmascaramiento de nieve, armonización, fusión y compuestos temporales.
Este paquete se prueba con Python 3.12.*. Puede que funcione o no con otras versiones.
pip install sentle
o
git clone [email protected]:cmosig/sentle.git
cd sentle
pip install -e .
Proceso
Sólo hay una función importante: process
. Aquí se especifican todos los parámetros necesarios para la descarga y el procesamiento. Una vez que se llama a esta función, inmediatamente comienza a descargar y procesar los datos que especificó en un archivo 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,
)
Este código descarga datos para un área de 40 km por 40 km con un año de Sentinel-1 y Sentinel-2. Las nubes y la nieve se detectan y reemplazan con NaN. Los datos también se promedian cada 7 días.
Todo está paralelizado entre 10 trabajadores y cada trabajador guarda inmediatamente sus resultados en la ruta especificada a zarr_store
. Esto garantiza que pueda descargar cubos con un tamaño mayor que la memoria.
Explicación:
zarr_store
: guardar ruta.target_crs
: especifica el CRS de destino en el que se reproyectarán todos los datos.target_resolution
: determina la resolución espacial a la que se reproyectan todos los datos en target_crs
.bound_*
: Límites espaciales en target_crs
del área que desea descargar. Comportamiento indefinido si la diferencia entre límites opuestos no es divisible por target_resolution
.datetime
: Rango de tiempo que se descargará.S2_mask_snow
: si se debe calcular la máscara de nieve para los datos de Sentinel-2.S2_cloud_classification
: si se debe realizar una capa de clasificación en la nube para los datos de Sentinel-2.S2_cloud_classification_device
: Dónde ejecutar la clasificación de la nube. Si tiene una GPU Nvidia, pase cuda
de lo contrario, cpu
(predeterminado).S2_apply_*
: si se debe aplicar la máscara respectiva, es decir, reemplazar los valores por NaN.S1_assets
: qué activos de Sentinel-1 descargar. Deshabilite Sentinel-1 configurándolo en None
.time_composite_freq
: Intervalo de redondeo a través del cual se promedian los datos. Utiliza pandas.Timestamp.round(time_composite_freq)
. Las máscaras de nubes/nieve se eliminan después del enmascaramiento porque no se pueden agregar.num_workers
: número de núcleos a utilizar. Planifique aproximadamente 2 GiB de uso de memoria por trabajador. -1 significa todos los núcleos.processing_spatial_chunk_size
: tamaño de los fragmentos espaciales que se procesan en paralelo. El valor predeterminado es 4000.overwrite
: si se sobrescribe la tienda zarr si ya existe. El valor predeterminado es Falso.Visualizar
Cargue los datos con xarray.
import xarray as xr
da = xr.open_zarr("mycube.zarr").sentle
da
Y visualícelo usando el increíble paquete lexcube. Aquí, la banda B02 se visualiza en el ejemplo anterior. Se pueden detectar los claros de las nubes y la cobertura irregular durante el invierno.
import lexcube
lexcube.Cube3DWidget(da.sel(band="B02"), vmin=0, vmax=4000)
Aumente la cantidad de trabajadores usando el parámetro num_workers
al configurar la clase Sentle
. Con un tamaño de fragmento espacial predeterminado de 4000, especificado processing_spatial_chunk_size
, debe planificar con 2 GiB por trabajador.
Envíe problemas o solicitudes de extracción si cree que falta algo o es necesario solucionarlo.
Este proyecto tiene la licencia MIT; consulte el archivo LICENSE.md para obtener más detalles.