Загрузите кубы данных Sentinel-1 и Sentinel-2 огромного масштаба (больше памяти) на любую машину со встроенным обнаружением облаков, маскированием снега, гармонизацией, слиянием и временными композитами.
Этот пакет протестирован на Python 3.12.*. Он может работать или не работать с другими версиями.
pip install sentle
или
git clone [email protected]:cmosig/sentle.git
cd sentle
pip install -e .
Процесс
Есть только одна важная функция: process
. Здесь вы указываете все параметры, необходимые для загрузки и обработки. Как только эта функция вызывается, она сразу же начинает загрузку и обработку указанных вами данных в 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,
)
Этот код загружает данные для территории размером 40 на 40 км с использованием Sentinel-1 и Sentinel-2 за один год. Облака и снег обнаруживаются и заменяются NaN. Данные также усредняются каждые 7 дней.
Все распараллеливается между 10 воркёрами, и каждый воркёр немедленно сохраняет свои результаты по указанному пути в zarr_store
. Это гарантирует, что вы сможете загружать кубы размером больше памяти.
Объяснение:
zarr_store
: путь сохранения.target_crs
: указывает целевой CRS, на который будут перепроецированы все данные.target_resolution
: определяет пространственное разрешение, с которым перепроецируются все данные в target_crs
.bound_*
: Пространственные границы в target_crs
области, которую вы хотите загрузить. Неопределенное поведение, если разница между противоположными границами не делится на target_resolution
.datetime
: диапазон времени, который будет загружен.S2_mask_snow
: вычислять ли снежную маску для данных Sentinel-2.S2_cloud_classification
: следует ли выполнять уровень облачной классификации для данных Sentinel-2.S2_cloud_classification_device
: где запускать классификацию облаков. Если у вас графический процессор Nvidia, передайте cuda
в противном случае — cpu
(по умолчанию).S2_apply_*
: следует ли применять соответствующую маску, т. е. заменять значения на NaN.S1_assets
: какие ресурсы Sentinel-1 загрузить. Отключите Sentinel-1, установив для этого параметра значение None
.time_composite_freq
: интервал округления, по которому усредняются данные. Использует pandas.Timestamp.round(time_composite_freq)
. Маски облаков/снег удаляются после маскировки, поскольку их нельзя агрегировать.num_workers
: количество используемых ядер. Запланируйте использование памяти примерно по 2 ГиБ на каждого работника. -1 означает все ядра.processing_spatial_chunk_size
: Размер пространственных фрагментов, которые обрабатываются параллельно. По умолчанию 4000.overwrite
: перезаписывать ли хранилище zarr, если оно уже существует. По умолчанию — ложь.Визуализируйте
Загрузите данные с помощью xarray.
import xarray as xr
da = xr.open_zarr("mycube.zarr").sentle
da
И визуализируйте, используя потрясающий пакет lexcube. Здесь полоса B02 визуализирована из приведенного выше примера. Зимой можно заметить просветы в облаках и пятнистое покрытие.
import lexcube
lexcube.Cube3DWidget(da.sel(band="B02"), vmin=0, vmax=4000)
Увеличьте количество воркеров, используя параметр num_workers
при настройке класса Sentle
. Если размер пространственного фрагмента по умолчанию равен 4000, указанный в processing_spatial_chunk_size
, вам следует запланировать 2 ГБ на каждого работника.
Пожалуйста, отправляйте проблемы или запросы на включение, если вы чувствуете, что чего-то не хватает или необходимо исправить.
Этот проект лицензируется по лицензии MIT — подробности см. в файле LICENSE.md.