📁 Код генератора геоотчёта (Python)
import os
import json
from fpdf import FPDF
from datetime import datetime
# 📌 Путь к сохранённым данным съёмки и анализов
DATA_DIR = "./engine/logs/reports/"
OUTPUT_DIR = "./engine/logs/generated/"
class GeoReport:
def __init__(self, mission_name):
self.mission_name = mission_name
self.report_data = {}
self.date = datetime.now().strftime("%Y-%m-%d %H:%M")
def load_data(self):
file_path = os.path.join(DATA_DIR, f"{self.mission_name}.json")
if not os.path.exists(file_path):
raise FileNotFoundError(f"Нет данных для отчёта: {file_path}")
with open(file_path, 'r', encoding='utf-8') as f:
self.report_data = json.load(f)
def generate_pdf(self):
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", "B", 14)
# Заголовок
pdf.cell(0, 10, f"📍 Геоотчёт: {self.mission_name}", ln=True)
pdf.set_font("Arial", "", 12)
pdf.cell(0, 10, f"Дата генерации: {self.date}", ln=True)
# 📊 Основные параметры
pdf.ln(10)
for key, value in self.report_data.items():
if isinstance(value, dict):
pdf.set_font("Arial", "B", 12)
pdf.cell(0, 10, f"🔹 {key}", ln=True)
pdf.set_font("Arial", "", 12)
for subkey, subvalue in value.items():
pdf.cell(0, 10, f" • {subkey}: {subvalue}", ln=True)
else:
pdf.cell(0, 10, f"{key}: {value}", ln=True)
# Сохранение
os.makedirs(OUTPUT_DIR, exist_ok=True)
output_path = os.path.join(OUTPUT_DIR, f"{self.mission_name}_report.pdf")
pdf.output(output_path)
return output_path
# 🧪 Пример использования:
if __name__ == "__main__":
report = GeoReport("test_mission_01")
report.load_data()
path = report.generate_pdf()
print(f"✅ Отчёт сохранён: {path}")
🔧 Где размещать:
report_generator.py
→ в папку Webkuriercore/ рядом с main.py
- Данные в формате JSON →
engine/logs/reports/
- PDF-файлы отчётов →
engine/logs/generated/
📂 Пример входного файла:
{
"Участок": "Полевой массив 3A",
"GSD": "3.5 см/пиксель",
"Высота полета": "120 м",
"Камера": "Sony RX1RM2",
"Количество снимков": 198,
"Размер области": "12.5 га",
"Перекрытие": {
"Продольное": "80%",
"Поперечное": "70%"
},
"Результаты": {
"Ортофотоплан": "Сформирован",
"ЦМР": "Готова",
"3D-сцена": "Экспортирована в OBJ"
}
}
📂 Структура папок проекта
engine/
├── agents/
│ ├── geodesist/
│ │ ├── report/ ← Генерация PDF, GeoTIFF, NDVI
│ │ ├── ui/ ← Интерфейс кнопок /отчёт, /цены
│ │ └── templates/ ← HTML, PDF шаблоны отчётов
│ ├── autopilot/ ← Агент автопилота дрона
│ ├── pilot/ ← Агент ручного управления
│ ├── telemetry/ ← Сбор телеметрии
│ ├── translator/ ← Переводчик и локализация
│ ├── accountant/ ← Финансовые отчёты и налоги
│ ├── security/ ← Агент безопасности (антивирус, токены)
│ └── master/ ← Главный управляющий
│
├── config/
│ ├── settings.json ← Глобальная конфигурация
│ ├── missions.json ← Настройки полётов
│ └── report_config.json ← Настройки отчётов
│
├── logs/
│ ├── reports/ ← Сырые JSON-данные полей
│ ├── generated/ ← PDF, GeoTIFF, модели
│ └── telemetry/ ← Данные полёта, датчики
│
├── memory/
│ └── assistant_memory.json ← Виртуальная память помощника
│
├── prompts/
│ ├── geodesy.prompt.json ← Шаблоны задач по геодезии
│ ├── report.prompt.json ← Формулировки отчётов
│ └── ui.prompt.json ← Тексты кнопок и интерфейса
│
├── ui/
│ ├── index.html ← Интерфейс WebApp
│ ├── report-ui.html ← Отдельная страница отчёта
│ ├── styles.css ← Стили
│ └── scripts/
│ ├── report.js ← Кнопка /отчёт
│ ├── prices.js ← Кнопка /цены
│ └── utils.js ← Общие функции
│
└── data/
├── cameras.json ← Список камер и GSD
├── price_list.csv ← Прайс на 1 км²
└── missions/
└── mission1.json ← Настройки миссий