/
Seler1ty
/
DataSet_Pipeline
Обзор
Документация
Войти
/
Seler1ty
/
DataSet_Pipeline
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
ndvi.py
125 строк
4 KB
Seler1ty
-m update main.py; create ndvi.py, route_osm.py
11 дек 2025, 17:04
11 дек 2025, 17:04
ea55bc9
Код
Авторство
О чём код?
import ee import pandas as pd import ast # Инициализация Google Earth Engine try: ee.Authenticate() ee.Initialize(project='golden-joy-474910-c0') print("✓ Google Earth Engine инициализирован") except Exception as e: print(f"✗ Ошибка инициализации Google Earth Engine: {e}") def mask_sentinel_clouds(image): """Маска облаков для Sentinel-2""" qa = image.select('QA60') cloud_bit_mask = 1 << 10 cirrus_bit_mask = 1 << 11 mask = qa.bitwiseAnd(cloud_bit_mask).eq(0) and qa.bitwiseAnd(cirrus_bit_mask).eq(0) return image.updateMask(mask) def calculate_ndvi_for_polygon(coordinates): """Вычисляет среднее значение NDVI для полигона""" try: # Преобразуем координаты в формат (lon, lat) для Earth Engine points = [] for coord in coordinates: # coord в формате (lat, lon) из CSV lat, lon = coord points.append([lon, lat]) # Earth Engine использует (lon, lat) if len(points) < 3: return 0.0 # Создаем полигон aoi = ee.Geometry.Polygon(points) # Фильтруем коллекцию Sentinel-2 sentinel_collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') \ .filterBounds(aoi) \ .filterDate('2023-05-01', '2023-09-30') \ .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) \ .map(mask_sentinel_clouds) # Проверяем количество изображений collection_size = sentinel_collection.size().getInfo() if collection_size == 0: return 0.0 # Создаем медианный композит composite = sentinel_collection.median() # Вычисляем NDVI: (NIR - Red) / (NIR + Red) # Для Sentinel-2: B8 - NIR, B4 - Red ndvi = composite.normalizedDifference(['B8', 'B4']).rename('NDVI') # Вычисляем среднее значение NDVI для полигона ndvi_value = ndvi.reduceRegion( reducer=ee.Reducer.mean(), geometry=aoi, scale=10 # Разрешение 10 метров ).get('NDVI') result = ndvi_value.getInfo() return float(result) if result is not None else 0.0 except Exception as e: print(f" Ошибка расчета NDVI: {e}") return 0.0 def add_ndvi_to_csv(input_csv, output_csv): """Добавляет колонку NDVI к паркам""" print(f"Добавление NDVI в {input_csv}...") try: # Читаем CSV df = pd.read_csv(input_csv) # Проверяем наличие колонки coordinates if 'coordinates' not in df.columns: print("✗ В файле нет колонки 'coordinates'") return False # Вычисляем NDVI для каждой строки ndvi_values = [] total_rows = len(df) for i, row in df.iterrows(): try: # Преобразуем строку с координатами в список coords = ast.literal_eval(row['coordinates']) # Вычисляем NDVI ndvi = calculate_ndvi_for_polygon(coords) ndvi_values.append(ndvi) # Прогресс if (i + 1) % 10 == 0: print(f" Обработано {i + 1}/{total_rows} строк") # Задержка для избежания лимитов API if (i + 1) % 50 == 0: import time time.sleep(2) except Exception as e: print(f" Ошибка в строке {i}: {e}") ndvi_values.append(0.0) # Добавляем колонку NDVI df['ndvi'] = ndvi_values # Удаляем строки с нулевым NDVI original_count = len(df) df = df[df['ndvi'] > 0] removed_count = original_count - len(df) # Сохраняем результат df.to_csv(output_csv, index=False) print(f"✓ {input_csv}: добавлено {len(df)} строк, удалено {removed_count}") return True except Exception as e: print(f"✗ Ошибка при обработке {input_csv}: {e}") return False