Высота и экструзия для 3D

3D-представление в Kepler.gl строится поверх архитектуры deck.gl, где геометрия слоя отделена от его визуального поведения. Высота объектов не является самостоятельной сущностью — она задаётся через параметры рендеринга слоёв и интерпретируется GPU как смещение по оси Z.

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

Основные механизмы 3D-экструзии:

  • параметрическая высота (constant elevation)
  • атрибутивная высота (data-driven elevation)
  • агрегационная высота (grouped/clustered elevation)
  • комбинированная высота (value + scale + normalization)

Геометрия экструзии в слоях Kepler.gl

Полигональная экструзия

Полигональные данные получают объём через параметр extruded. В основе лежит преобразование плоского полигона в призму.

Внутри deck.gl используется PolygonLayer, где включение 3D-режима активирует построение боковых граней.

Ключевые параметры:

  • extruded: true — включает 3D-геометрию
  • elevationScale — множитель высоты
  • getElevation — функция извлечения высоты из данных
  • material — свойства освещения (ambient, diffuse, specular)

Математически высота каждого полигона может быть выражена как:

h = f(d) s

где f(d) — функция, извлекающая значение из данных, а s — масштабирование слоя.

Полигональная экструзия активно применяется для:

  • плотности населения по регионам
  • административных границ с метриками
  • климатических зон
  • экономических индикаторов

HexagonLayer и агрегационная высота

HexagonLayer выполняет H3-агрегацию данных и формирует шестиугольные ячейки, каждая из которых получает высоту на основе агрегированного значения.

Основные особенности:

  • пространственная индексация через H3
  • автоматическая кластеризация точек
  • вычисление статистики внутри ячейки

Высота ячейки формируется как функция агрегата:

h = _{i=1}^{n} w_i

или в нормализованном виде:

h =

Типичные агрегаты:

  • count
  • mean
  • max
  • min
  • weighted sum

HexagonLayer обеспечивает визуализацию плотности событий, например:

  • трафик поездок
  • GPS-треки
  • точки продаж
  • пользовательская активность

ColumnLayer и точечная экструзия

ColumnLayer используется для построения вертикальных столбцов над точками. Каждый столбец представляет отдельную запись данных.

Ключевые параметры:

  • getElevation — высота столбца
  • radius — радиус основания
  • diskResolution — гладкость цилиндра
  • elevationScale — масштабирование

В отличие от полигонов, ColumnLayer работает с точками и генерирует цилиндрические формы.

Высота может зависеть от:

  • числового значения (например, продажи)
  • категориального веса
  • нормализованной метрики

Параметр elevationScale и управление восприятием высоты

Параметр elevationScale отвечает за визуальное усиление или ослабление вертикального измерения.

Он применяется ко всем слоям, поддерживающим 3D:

  • PolygonLayer
  • HexagonLayer
  • ColumnLayer

Фактически он масштабирует результат функции высоты:

h’ = h k

где k — коэффициент усиления.

Использование этого параметра критично при:

  • работе с малыми числовыми диапазонами
  • визуализации больших территорий с неравномерными данными
  • предотвращении визуального «сплющивания» модели

Геометрия сцены: pitch, bearing и перспектива

3D-эффект в Kepler.gl зависит не только от высоты объектов, но и от параметров камеры.

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

  • pitch — угол наклона камеры
  • bearing — поворот карты
  • zoom — масштаб
  • latitude / longitude — центр сцены

При pitch = 0 сцена остаётся плоской, даже если экструзия включена. При увеличении pitch появляется перспектива, раскрывающая вертикальные различия.

Комбинация pitch и bearing определяет восприятие глубины:

  • низкий pitch → аналитический режим
  • средний pitch → пространственная структура
  • высокий pitch → архитектурная визуализация

Освещение и материализация 3D объектов

3D-слои в Kepler.gl используют модель освещения, основанную на WebGL.

Материал слоя включает:

  • ambient light — общий фон освещения
  • diffuse light — рассеянный свет
  • specular light — блики

Это позволяет воспринимать высоту не как абстрактную величину, а как физический объект.

Влияние освещения особенно заметно на:

  • экструзиях полигонов
  • столбцах ColumnLayer
  • объемных гексагональных ячейках

Без освещения высота теряет визуальную читаемость, превращаясь в плоскую шкалу.


Данные как источник высоты

Высота в Kepler.gl всегда вычисляется из данных через функции доступа.

Типовой механизм:

  • getElevation: d => d.value
  • getElevation: d => d.count
  • getElevation: d => d.metricA + d.metricB

При этом возможны преобразования:

  • логарифмическое масштабирование
  • нормализация в диапазон [0, 1]
  • квантование значений

Логарифмическое преобразование часто используется для сглаживания распределений:

h = (1 + x)

Это особенно важно при работе с данными, имеющими экспоненциальное распределение (например, население или доходы).


Экструзия GeoJSON и сложные полигоны

При работе с GeoJSON каждый объект преобразуется в набор треугольников (tessellation). Это необходимо для корректного построения боковых граней.

Процесс включает:

  1. разбиение полигона на треугольники
  2. вычисление нормалей
  3. генерацию боковых поверхностей
  4. применение высоты к каждой вершине

Сложные полигоны с отверстиями требуют дополнительной обработки:

  • inner rings
  • outer rings
  • корректировка winding order

Ошибки в структуре GeoJSON приводят к искажению экструзии или исчезновению граней.


Взаимодействие слоёв и конфликт высот

При наложении нескольких 3D-слоёв возникает проблема визуальной конкуренции высот.

Типичные сценарии:

  • HexagonLayer перекрывает ColumnLayer
  • PolygonLayer скрывает столбцы
  • несогласованные elevationScale

Решение заключается в:

  • управлении order слоёв
  • разделении диапазонов высот
  • применении opacity и blending modes

Также используется разнесение по масштабу:

  • крупные слои → низкий elevationScale
  • детальные слои → высокий elevationScale

Производительность 3D-экструзии

3D-визуализация напрямую зависит от GPU и количества вершин.

Факторы влияния:

  • количество полигонов
  • сложность геометрии
  • включённое освещение
  • число активных слоёв

Оптимизации включают:

  • упрощение геометрии (simplification)
  • агрегацию данных (hex binning)
  • снижение diskResolution в ColumnLayer
  • отключение extruded для второстепенных слоёв

При больших наборах данных агрегация становится обязательной, иначе рендеринг теряет стабильность FPS.


Динамическая высота и анимации

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

Типовые сценарии:

  • рост городов
  • изменение плотности трафика
  • временные события

Интерполяция высоты задаётся как функция времени:

h(t) = h_0 + (h_1 - h_0) t

где t ∈ [0,1] — прогресс анимации.

Kepler.gl использует плавные переходы через интерполяцию WebGL-шейдеров, минимизируя скачки геометрии.


Комбинация 3D и цветового кодирования

Высота редко используется изолированно. Она комбинируется с цветом для многомерной визуализации.

Распространённые схемы:

  • высота = количество, цвет = категория
  • высота = интенсивность, цвет = скорость изменения
  • высота = суммарное значение, цвет = среднее значение

Такая комбинация позволяет:

  • разделять плотность и качество данных
  • выявлять аномалии
  • строить многослойные аналитические карты

Ограничения модели экструзии

Несмотря на гибкость, 3D-экструзия имеет структурные ограничения:

  • невозможность точного отображения сложных внутренних структур
  • искажение восприятия при высоких значениях pitch
  • ограничение глубины сцены WebGL
  • зависимость от плотности данных

Эти ограничения компенсируются агрегацией и правильной настройкой масштаба высоты.