# MapView Component - Leaflet карта с зонами и тепловой картой ## Дата: 2026-05-05 ### Созданные файлы: 1. MapView.jsx (9.5 KB) - основной компонент 2. MapView.css (2.1 KB) - стили 3. index.jsx - экспорт ### Функционал: #### 1. Базовая карта - Leaflet + OpenStreetMap тайлы - Инициализация с центром на ТНП - Zoom level: 13 (по умолчанию) - maxZoom: 19 #### 2. Маркер ТНП (Точка Начала Поиска) - Красный круглый маркер с текстом ТНП - Цвет: #ff4d00 (ЦОУ accent) - Белая рамка 3px - Popup с координатами - Размер: 40x40px (32x32px на мобильных) #### 3. Стрелка направления - Пунктирная линия от ТНП (1 км) - Цвет: #ff4d00 - Стрелка на конце с поворотом - Направления: N, NE, E, SE, S, SW, W, NW - Скрывается если direction = unknown #### 4. Секторные зоны (полигоны) - НЕ окружности, а секторы (угол 90°, ±45° от направления) - Цвета из §5 ЦОУ палитры: Зона 1 (0-500м): #ff4d00 (красный) Зона 2 (500-1500м): #ff9f1a (оранжевый) Зона 3 (1500-2500м): #ffd166 (желтый) - fillOpacity: 0.2 - weight: 2, opacity: 0.6 - Popup с информацией: название, приоритет, оценка, расстояние, reasoning #### 5. Тепловая карта (Leaflet.heat) - Переключаемый слой (кнопка в правом верхнем углу) - Параметры: radius 25, blur 15, maxZoom 17, max 1.0 - Градиент (ЦОУ палитра): 0.0: #0d1117 (темный) 0.3: #238636 (зеленый) 0.5: #ffd166 (желтый) 0.7: #ff9f1a (оранжевый) 1.0: #ff4d00 (красный) ### Props: - tnpLat: number - Широта ТНП (обязательно) - tnpLon: number - Долгота ТНП (обязательно) - zones: Array - Массив зон с полями: name, priority, score, distance_km, direction, reasoning - direction: string - Направление: N, NE, E, SE, S, SW, W, NW, unknown - heatmapData: Array - Массив точек с полями: lat, lon, intensity - showHeatmap: boolean - Показывать тепловую карту по умолчанию ### Математика: Вычисление точки назначения (Haversine): - R = 6371000 м (радиус Земли) - Преобразование lat/lon в радианы - Вычисление новой точки по азимуту и дистанции Секторный полигон: - Начало в ТНП - Угол сектора: 90° (±45° от направления) - Шаг генерации точек: 5° - Замыкание полигона обратно в ТНП ### Стилизация: Контейнер: - height: 600px (400px на мобильных) - background: #0a0c0f - border-radius: 12px - border: 1px solid #21262d Кнопка управления: - position: absolute, top: 16px, right: 16px - z-index: 1000 - background: #161b22 - active: #ff4d00 Popup: - background: #161b22 - color: #e6edf3 - border: 1px solid #30363d ### Зависимости (package.json): Требуется установить: - leaflet: ^1.9.4 - leaflet.heat: ^0.2.0 ### Особенности реализации: 1. useRef для слоев - избегаем пересоздания при ререндере 2. useEffect с зависимостями - обновление только при изменении props 3. Cleanup - удаление старых слоев перед добавлением новых 4. calculateDestination - точное вычисление координат по азимуту 5. Секторы вместо окружностей - более точное отображение зон поиска ### Файлы: - /root/vector/frontend/src/components/MapView/MapView.jsx - /root/vector/frontend/src/components/MapView/MapView.css - /root/vector/frontend/src/components/MapView/index.jsx ### Статус: Leaflet + OpenStreetMap Маркер ТНП с popup Стрелка направления (8 сторон света) Секторные полигоны (не окружности) Цвета зон из §5 ЦОУ (#ff4d00, #ff9f1a, #ffd166) Leaflet.heat с переключением Градиент тепловой карты (ЦОУ палитра) Адаптивный дизайн Дата создания: 2026-05-05