📊 Прайс на аэрофотосъёмку (1 км²)

Пакет Описание Цена Срок
1 Base Map Ортофото (GeoTIFF, JPG), PDF-карта, выравнивание, базовая обработка 390 € 1–2 дня
2 3D Terrain DSM/DTM, 3D-модель (.OBJ, .PLY, .LAS), облако точек, точная геопривязка 790 € 2–3 дня
3 GeoAnalysis NDVI/NDRE, растровый анализ, отчёт в PDF, контуры объектов, классификация 1290 € 3–5 дней

📁 Код генератора геоотчёта (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}")

🔧 Где размещать:

📂 Пример входного файла:

{
  "Участок": "Полевой массив 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 ← Настройки миссий