
Нікоряка Віктора Васильовича
Супутникові дані Sentinel-2 L2A забезпечують високу просторову роздільну здатність у видимому та інфрачервоному діапазонах. Ці дані використовувалися для моніторингу змін рослинного покриву, водних ресурсів та інших екологічних показників.
Висновок
Ці шари та спектральні канали дозволили провести детальний аналіз екосистем та змін, спричинених руйнуванням греблі, зокрема оцінити стан рослинного покриву, водних ресурсів.
Dynamic World — це продукт на основі даних Sentinel-2 L1C, який забезпечує майже реальні (NRT) оцінки землекористування/покриву території (LULC) із класами та ймовірностями.
Джерело даних:
Dynamic World by Google
Ці дані забезпечили основу для аналізу змін рослинного покриву та оцінки впливу екологічних змін на території колишнього Каховського водосховища.
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)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")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



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