Виступ у підсумковій конференції

Нікоряка Віктора Васильовича

Аспіранта Українського гідрометеорологічного інституту ДСНС України та НАН України

Тема Дослідження

Оцінка динаміки зміни водних об’єктів і рослинного покриву в зоні колишнього Каховського водосховища за допомогою індексу NDVI

Актуальність та мета дослідження

  • Актуальність: Після руйневання греблі Каховської ГЕС дослідники зіштовхнулися із серйозними екологічними викликами, зокрема із втратою водних екосистем та зміною рослинного покриву.
  • Мета: Провести оцінку динаміки змін водних об’єктів і рослинного покриву за допомогою сучасних методів дистанційного зондування.

Методологія

  1. Обробка растрових даних
    • Очищення даних
    • Нормалізація
    • Корекція сезонності
  2. Статистичний аналіз
    • Порівняння середніх значень типів землекористування
  3. Візуалізація
    • Картографування змін
    • Динамічні інтерактивні карти

Використані Дані

Sentinel-2 L2A

Dynamic World Dataset

Sentinel-2 L2A

Супутникові дані Sentinel-2 L2A забезпечують високу просторову роздільну здатність у видимому та інфрачервоному діапазонах. Ці дані використовувалися для моніторингу змін рослинного покриву, водних ресурсів та інших екологічних показників.

  • Роздільна здатність: 10 м, 20 м, 60 м (залежно від спектрального діапазону).
  • Частота повторного покриття: 2–5 днів.

Використані шари

  1. True color: Поєднання B4, B3, B2 — для візуалізації природного кольору.
  1. NDVI (Normalized Difference Vegetation Index): Інформація про стан рослинного покриву (B8, B4).
  1. NDWI (Normalized Difference Water Index): Ідентифікація водних об’єктів (B3, B8).
  1. Scene Classification Map: є результатом алгоритму класифікації сцен, який виконує ESA. Надається дванадцять різних класифікацій, включаючи класи хмар, рослинності, ґрунту, води та снігу

Необроблені спектральні канали

  • B01: Аерозоль (60 м)
  • B02: Синій (10 м)
  • B03: Зелений (10 м)
  • B04: Червоний (10 м)
  • B05: Червоний край-1 (20 м)
  • B06: Червоний край-2 (20 м)

Необроблені спектральні канали

  • B07: Червоний край-3 (20 м)
  • B08: NIR (10 м)
  • B8A: NIR вузький (20 м)
  • B11: SWIR-1 (20 м)
  • B12: SWIR-2 (20 м)

Джерело даних

Copernicus Sentinel-2

Висновок

Ці шари та спектральні канали дозволили провести детальний аналіз екосистем та змін, спричинених руйнуванням греблі, зокрема оцінити стан рослинного покриву, водних ресурсів.

Умови Обробки

  • Фільтрація хмарності: Дані з рівнем хмарності понад 10% були виключені з аналізу.
  • Атмосферна корекція: Використовувалися лише продукти Sentinel-2 L2A, які пройшли атмосферну корекцію за допомогою алгоритму Sen2Cor.
  • Вибір останніх знімків: Аналіз проводився на основі найновіших доступних зображень для мінімізації часової затримки.

Dynamic World Dataset

Dynamic World — це продукт на основі даних Sentinel-2 L1C, який забезпечує майже реальні (NRT) оцінки землекористування/покриву території (LULC) із класами та ймовірностями.

  • Класи: 9 класів (вода, рослинність, сільськогосподарські угіддя тощо).
  • Просторова роздільна здатність: 10 м.
  • Умови відбору даних: Поріг хмарності до 35%, але для аналізу вибрано дані лише з хмарністю до 10%.

Джерело даних:
Dynamic World by Google

Корисні Посилання

  1. Офіційна інформація про супутники Copernicus Sentinel-2
  2. Опис Dynamic World на Nature
  3. Sentinel Hub EO Browser

Ці дані забезпечили основу для аналізу змін рослинного покриву та оцінки впливу екологічних змін на території колишнього Каховського водосховища.

Код для аналізу Dynamic World

import ee
import geopandas as gpd

# Ініціалізація Google Earth Engine
ee.Initialize()

# Завантаження вашої зони дослідження
study_area = gpd.read_file('Kakhovka_SA.geojson')
study_area = study_area.explode(index_parts=False).reset_index(drop=True)
study_area_geom = ee.Geometry.MultiPolygon([list(polygon.exterior.coords) for polygon in study_area.geometry])

# Завантаження даних Dynamic World
landcover_collection = ee.ImageCollection("GOOGLE/DYNAMICWORLD/V1") \
    .filterBounds(study_area_geom) \
    .select('label')

# Функція для перевірки наявності даних і експорту
def export_weekly_image_to_drive(week_start):
    week_start = ee.Date(week_start)
    week_end = week_start.advance(1, 'week')

    # Фільтрування колекції для заданого тижня
    weekly_collection = landcover_collection.filterDate(week_start, week_end)

    # Перевірка наявності даних
    if weekly_collection.size().getInfo() == 0:
        print(f"Немає даних для тижня {week_start.format('YYYY-MM-dd').getInfo()}")
        return  # Пропустити цей тиждень

    # Створення зображення із режимом (mode)
    weekly_image = weekly_collection.mode().clip(study_area_geom)

    # Отримання назви файлу з дати
    date_str = week_start.format("YYYY-MM-dd").getInfo()

    # Експорт зображення у Google Drive
    export_task = ee.batch.Export.image.toDrive(
        image=weekly_image,
        description=f"LandCover_{date_str}",
        folder="EarthEngineExports",
        scale=10,
        region=study_area_geom,
        maxPixels=1e9,
        fileFormat='GeoTIFF'
    )
    export_task.start()
    print(f"Експорт даних для тижня {date_str} розпочато.")

# Створення списку дат для тижнів
dates = ee.List.sequence(0, 143).map(lambda i: ee.Date('2022-01-01').advance(i, 'week').format("YYYY-MM-dd"))

# Запуск експорту
for date_str in dates.getInfo():
    export_weekly_image_to_drive(date_str)

Обрізка супутникових даних за допомогою Python і GDAL

from osgeo import gdal

# Визначення входу і маски
input_raster = 'input.tif'
mask_vector = 'mask.geojson'
output_raster = 'clipped_output.tif'

# Обрізка
gdal.Warp(output_raster, input_raster, cutlineDSName=mask_vector, cropToCutline=True)
print("Обрізка завершена.")

Код Python для обчислення NDVI

from osgeo import gdal
import numpy as np

def calculate_ndvi(red_band_path, nir_band_path, output_path):
    """
    Обчислює NDVI (Normalized Difference Vegetation Index) і зберігає результат у GeoTIFF.

    Параметри:
    ----------
    red_band_path : str
        Шлях до файлу з червоним каналом (Red).
    nir_band_path : str
        Шлях до файлу з ближнім інфрачервоним каналом (NIR).
    output_path : str
        Шлях для збереження результату у форматі GeoTIFF.

    Формула:
    --------
    NDVI = (NIR - Red) / (NIR + Red)
    
    Приклад використання:
    ---------------------
    calculate_ndvi("red_band.tiff", "nir_band.tiff", "output_ndvi.tiff")
    """
    try:
        # Відкриття файлів каналів
        red_ds = gdal.Open(red_band_path)
        nir_ds = gdal.Open(nir_band_path)
        
        if red_ds is None or nir_ds is None:
            raise ValueError("Не вдалося відкрити один із вказаних файлів.")
        
        # Зчитування даних з каналів
        red_band = red_ds.GetRasterBand(1).ReadAsArray().astype(np.float32)
        nir_band = nir_ds.GetRasterBand(1).ReadAsArray().astype(np.float32)
        
        # Розрахунок NDVI
        ndvi = (nir_band - red_band) / (nir_band + red_band)
        ndvi[np.isinf(ndvi)] = np.nan  # Уникнення помилок через ділення на нуль

        # Створення GeoTIFF для результату
        driver = gdal.GetDriverByName('GTiff')
        output_ds = driver.Create(
            output_path,
            red_ds.RasterXSize,
            red_ds.RasterYSize,
            1,
            gdal.GDT_Float32
        )
        output_ds.SetGeoTransform(red_ds.GetGeoTransform())
        output_ds.SetProjection(red_ds.GetProjection())
        output_ds.GetRasterBand(1).WriteArray(ndvi)
        output_ds.FlushCache()
        print(f"NDVI успішно збережено у: {output_path}")
    except Exception as e:
        print(f"Помилка під час обчислення NDVI: {e}")
    finally:
        # Закриття файлів
        red_ds = None
        nir_ds = None
        output_ds = None

# Приклад виклику функції
calculate_ndvi("path_to_red_band.tiff", "path_to_nir_band.tiff", "output_ndvi.tiff")

Код Python для обчислення NDWI

from osgeo import gdal
import numpy as np

def calculate_ndwi(green_band_path, nir_band_path, output_path):
    """
    Обчислює NDWI (Normalized Difference Water Index) і зберігає результат у GeoTIFF.

    Параметри:
    ----------
    green_band_path : str
        Шлях до файлу з зеленим каналом (Green).
    nir_band_path : str
        Шлях до файлу з ближнім інфрачервоним каналом (NIR).
    output_path : str
        Шлях для збереження результату у форматі GeoTIFF.

    Формула:
    --------
    NDWI = (Green - NIR) / (Green + NIR)
    
    Приклад використання:
    ---------------------
    calculate_ndwi("green_band.tiff", "nir_band.tiff", "output_ndwi.tiff")
    """
    try:
        # Відкриття файлів каналів
        green_ds = gdal.Open(green_band_path)
        nir_ds = gdal.Open(nir_band_path)
        
        if green_ds is None or nir_ds is None:
            raise ValueError("Не вдалося відкрити один із вказаних файлів.")
        
        # Зчитування даних з каналів
        green_band = green_ds.GetRasterBand(1).ReadAsArray().astype(np.float32)
        nir_band = nir_ds.GetRasterBand(1).ReadAsArray().astype(np.float32)
        
        # Розрахунок NDWI
        ndwi = (green_band - nir_band) / (green_band + nir_band)
        ndwi[np.isinf(ndwi)] = np.nan  # Уникнення помилок через ділення на нуль

        # Створення GeoTIFF для результату
        driver = gdal.GetDriverByName('GTiff')
        output_ds = driver.Create(
            output_path,
            green_ds.RasterXSize,
            green_ds.RasterYSize,
            1,
            gdal.GDT_Float32
        )
        output_ds.SetGeoTransform(green_ds.GetGeoTransform())
        output_ds.SetProjection(green_ds.GetProjection())
        output_ds.GetRasterBand(1).WriteArray(ndwi)
        output_ds.FlushCache()
        print(f"NDWI успішно збережено у: {output_path}")
    except Exception as e:
        print(f"Помилка під час обчислення NDWI: {e}")
    finally:
        # Закриття файлів
        green_ds = None
        nir_ds = None
        output_ds = None

# Приклад виклику функції
calculate_ndwi("path_to_green_band.tiff", "path_to_nir_band.tiff", "output_ndwi.tiff")

##Карта землекористування LULC

Зображення 2023-05-06

Зображення 2024-09-28

Графік змін землекористування

Порівняння середніх значень типів землекористування

Загальний опис

Дослідження змін NDVI та NDWI у зоні колишнього Каховського водосховища

Інтерактивна карта NDVI

[1] "Знайдено файлів: 21"

Інтерактивна карта NDWI

[1] "Знайдено файлів: 21"

Висновки

  • На колишньому дні водойми формується новий рослинний покрив, що включає вербу, тополю чорну та тополю білу.1
  • Спостерігається активне заростання території після осушення.
  • Проведені дослідження демонструють, що рівень води та умови зволоження впливають на виживання рослинних видів.
  • Порівняння сучасних карт з історичними дозволяє виявити, як ландшафт повертається до природного стану до руйнування.