/
Seler1ty
/
DataSet_Pipeline
Обзор
Документация
Войти
/
Seler1ty
/
DataSet_Pipeline
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
area.py
91 строка
3 KB
Seler1ty
-m create main.py json_to_csv.py, area.py, population.py
11 дек 2025, 11:33
11 дек 2025, 11:33
dcb73d9
Код
Авторство
О чём код?
import json import csv import ast import math def calculate_area(coordinates): """Быстрый расчет площади полигона в квадратных метрах""" try: if len(coordinates) < 3: return 0 # Формула шнурования (Shoelace formula) area = 0.0 n = len(coordinates) for i in range(n): j = (i + 1) % n # coordinates: [(lat1, lon1), (lat2, lon2), ...] area += coordinates[i][0] * coordinates[j][1] # lat_i * lon_j area -= coordinates[j][0] * coordinates[i][1] # lat_j * lon_i area = abs(area) / 2.0 # Конвертируем в квадратные метры lat_scale = 111319.9 # метров в градусе широты avg_lat = sum([coord[0] for coord in coordinates]) / n lon_scale = 111319.9 * math.cos(math.radians(avg_lat)) return abs(area * lat_scale * lon_scale) except Exception: return 0 def add_area_to_csv(input_csv, output_csv, dataset_type='park'): """Добавляет колонку area в CSV файл""" print(f"Добавление area в {input_csv}...") try: with open(input_csv, 'r', encoding='utf-8') as infile: reader = csv.DictReader(infile) rows = list(reader) # Определяем заголовки if dataset_type == 'park': headers = ['id', 'lat', 'lon', 'coordinates', 'area'] else: # area headers = ['id', 'lat', 'lon', 'coordinates', 'area'] with open(output_csv, 'w', newline='', encoding='utf-8') as outfile: writer = csv.DictWriter(outfile, fieldnames=headers) writer.writeheader() processed = 0 removed = 0 for row in rows: try: # Преобразуем строку с координатами coords_str = row['coordinates'] coordinates = ast.literal_eval(coords_str) # Вычисляем площадь area = calculate_area(coordinates) # Удаляем строки с нулевой площадью if area == 0: removed += 1 continue # Формируем новую строку new_row = { 'id': row['id'], 'lat': row['lat'], 'lon': row['lon'], 'coordinates': coords_str, 'area': f"{area:.2f}" } writer.writerow(new_row) processed += 1 except Exception: removed += 1 continue print(f"✓ {input_csv}: обработано {processed} строк, удалено {removed}") return True except Exception as e: print(f"✗ Ошибка при обработке {input_csv}: {e}") return False