Включение 3D режима

3D-режим в Kepler.gl расширяет стандартную двумерную картографическую визуализацию, добавляя поддержку высот, наклона камеры, объёмных слоёв и перспективного рендеринга. В основе этого режима лежит интеграция с WebGL и архитектурой deck.gl, что позволяет обрабатывать большие объёмы геоданных с аппаратным ускорением и сохранять интерактивность даже при высокой плотности объектов.

3D-визуализация в Kepler.gl не является отдельным режимом карты, а представляет собой комбинацию настроек камеры, слоёв и трансформаций данных. Основная логика строится вокруг концепции сцены, где каждый слой может быть интерпретирован как двумерный или трёхмерный объект.

Ключевые компоненты:

  • камера (camera state), отвечающая за положение наблюдателя;
  • слои (layers), поддерживающие extrusion и высотные параметры;
  • движок рендеринга WebGL через deck.gl;
  • геопространственная привязка через Mapbox GL JS.

Kepler.gl не просто «включает 3D», а переключает систему координат и визуальную интерпретацию сцены, добавляя Z-компонент в географические данные.

Камера и перспектива

3D-режим активируется через изменение состояния камеры. Вместо ортографической проекции используется перспективная, что позволяет имитировать человеческое зрение.

Основные параметры камеры:

  • longitude, latitude — центр карты;
  • zoom — масштаб сцены;
  • pitch — угол наклона (ключевой параметр для 3D);
  • bearing — поворот сцены вокруг вертикальной оси.

При увеличении pitch происходит переход от плоской карты к сцене с выраженной глубиной. При значениях близких к 0° визуализация остаётся двумерной, а при 45–60° появляется выраженный объём.

Включение 3D через интерфейс состояния

В Kepler.gl 3D-режим не задаётся отдельным булевым флагом. Вместо этого он формируется комбинацией параметров в состоянии приложения:

  • установка pitch > 0;
  • использование 3D-слоёв (extruded layers);
  • активация освещения сцены (light settings).

Пример логики состояния:

  • cameraState.pitch = 45;
  • cameraState.bearing = 0;
  • cameraState.zoom = 12;

Дополнительно важно учитывать, что изменение pitch автоматически влияет на поведение анимации и перерасчёт матрицы трансформации в WebGL.

Extruded-слои как основа объёма

Основной механизм 3D-визуализации в Kepler.gl — экструзия (extrusion). Она применяется к полигональным слоям и позволяет «выдавливать» геометрию по оси Z.

Типичные слои:

  • polygon layer с высотой;
  • hexagon layer (H3-гексагональная сетка);
  • grid layer с агрегированными значениями.

Высота объекта вычисляется на основе атрибута данных:

h = f(v)

где:

  • h — высота столбца или полигона;
  • v — значение показателя (например, плотность населения, количество событий);
  • f — функция масштабирования.

В реальных сценариях f может быть линейной, логарифмической или нормализующей.

Настройка высоты и масштабирования

Kepler.gl позволяет управлять тем, как числовые данные преобразуются в высоту объектов. Это критически важно для предотвращения визуальных искажений.

Основные подходы:

  • линейное масштабирование: подходит для равномерных распределений;
  • логарифмическое: используется при больших разбросах значений;
  • кастомные функции нормализации.

Визуально это влияет на читаемость карты: без нормализации высокие значения «подавляют» остальные объекты, делая сцену непропорциональной.

Освещение и восприятие глубины

3D-режим в Kepler.gl включает модель освещения, основанную на направленном источнике света. Это позволяет усиливать восприятие глубины и рельефа.

Основные параметры света:

  • направление (direction);
  • интенсивность (intensity);
  • цветовая температура.

При изменении угла камеры освещение пересчитывается, создавая эффект динамического затенения. Это особенно заметно на экструзированных полигонах и 3D-гексах.

Работа с H3-гексагональной сеткой

Одним из наиболее мощных инструментов 3D-визуализации является слой гексагонов на основе системы H3. Он позволяет агрегировать данные в регулярную пространственную сетку.

Каждая ячейка:

  • представляет регион;
  • содержит агрегированное значение;
  • визуализируется как столбец.

Высота гексагона вычисляется аналогично другим extruded-слоям, но с учётом плотности данных внутри ячейки.

Производительность 3D-сцены

3D-режим требует значительных ресурсов GPU, поэтому Kepler.gl использует несколько оптимизаций:

  • батчинг отрисовки объектов;
  • уровень детализации (LOD);
  • кэширование геометрии;
  • ограничение числа одновременно активных слоёв.

При увеличении количества объектов сложность сцены растёт примерно линейно по числу вершин, что напрямую влияет на FPS.

Взаимодействие с картой в 3D

Интерактивность сохраняется даже в перспективной проекции. Пользовательские действия интерпретируются через преобразование координат:

  • pan изменяет центр сцены;
  • zoom пересчитывает расстояние до камеры;
  • rotation изменяет bearing;
  • tilt влияет на матрицу проекции.

Проблема 3D-взаимодействия заключается в искажении расстояний: объекты на дальнем плане визуально сжимаются, но их географические координаты остаются линейными.

Ограничения 3D-режима

Несмотря на мощность, 3D-визуализация имеет ограничения:

  • снижение производительности на слабых GPU;
  • визуальная перегрузка при большом количестве слоёв;
  • сложность восприятия точных расстояний;
  • зависимость от качества исходных данных.

Эти ограничения требуют аккуратной настройки сцены и минимизации избыточных слоёв.

Синхронизация 3D-состояния

Kepler.gl хранит состояние сцены как единый объект, что позволяет синхронизировать 3D-параметры между компонентами приложения. Это особенно важно при:

  • сохранении конфигурации карты;
  • экспорте визуализации;
  • воспроизведении сцен в разных средах.

Состояние камеры и слоёв сериализуется, включая pitch, bearing и параметры экструзии, что позволяет полностью восстановить 3D-сцену без потерь.