Baixe cubos de dados Sentinel-1 e Sentinel-2 de grande escala (maiores que a memória) em qualquer máquina com detecção de nuvem integrada, mascaramento de neve, harmonização, fusão e composições temporais.
Este pacote foi testado com Python 3.12.*. Pode ou não funcionar com outras versões.
pip install sentle
ou
git clone [email protected]:cmosig/sentle.git
cd sentle
pip install -e .
Processo
Existe apenas uma função importante: process
. Aqui você especifica todos os parâmetros necessários para download e processamento. Depois que essa função é chamada, ela imediatamente inicia o download e o processamento dos dados especificados em um arquivo 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 baixa dados para uma área de 40 km por 40 km com um ano de Sentinel-1 e Sentinel-2. Nuvens e neve são detectadas e substituídas por NaNs. Os dados também são calculados em média a cada 7 dias.
Tudo é paralelizado em 10 trabalhadores e cada trabalhador salva imediatamente seus resultados no caminho especificado para zarr_store
. Isso garante que você possa fazer download de cubos maiores que a memória.
Explicação:
zarr_store
: Salva caminho.target_crs
: especifica o CRS de destino para o qual todos os dados serão reprojetados.target_resolution
: Determina a resolução espacial para a qual todos os dados são reprojetados em target_crs
.bound_*
: Limites espaciais em target_crs
da área que você deseja baixar. Comportamento indefinido se a diferença entre limites opostos não for divisível por target_resolution
.datetime
: intervalo de tempo que será baixado.S2_mask_snow
: se deve calcular a máscara de neve para dados do Sentinel-2.S2_cloud_classification
: se deve executar uma camada de classificação de nuvem para dados do Sentinel-2.S2_cloud_classification_device
: onde executar a classificação da nuvem. Se você tiver uma GPU Nvidia, passe cuda
caso contrário, cpu
(padrão).S2_apply_*
: Se deve aplicar a respectiva máscara, ou seja, substituir valores por NaN.S1_assets
: quais ativos do Sentinel-1 baixar. Desative o Sentinel-1 definindo-o como None
.time_composite_freq
: Intervalo de arredondamento através do qual a média dos dados é calculada. Usa pandas.Timestamp.round(time_composite_freq)
. As máscaras de nuvem/neve são descartadas após o mascaramento porque não podem ser agregadas.num_workers
: número de núcleos a serem usados. Planeje cerca de 2 GiB de uso de memória por trabalhador. -1 significa todos os núcleos.processing_spatial_chunk_size
: tamanho dos pedaços espaciais que são processados em paralelo. O padrão é 4000.overwrite
: Se deve substituir o armazenamento zarr se ele já existir. O padrão é falso.Visualizar
Carregue os dados com xarray.
import xarray as xr
da = xr.open_zarr("mycube.zarr").sentle
da
E visualize usando o incrível pacote lexcube. Aqui, a banda B02 é visualizada no exemplo acima. É possível detectar lacunas nas nuvens e cobertura irregular durante o inverno.
import lexcube
lexcube.Cube3DWidget(da.sel(band="B02"), vmin=0, vmax=4000)
Aumente o número de trabalhadores usando o parâmetro num_workers
ao configurar a classe Sentle
. Com o tamanho do pedaço espacial padrão de 4.000, especificado por processing_spatial_chunk_size
, você deve planejar com 2GiB por trabalhador.
Envie problemas ou receba solicitações se achar que algo está faltando ou precisa ser corrigido.
Este projeto está licenciado sob a licença MIT - consulte o arquivo LICENSE.md para obter detalhes.