Управление углом обзора и перспективой

В Kepler.gl управление углом обзора и перспективой опирается на состояние камеры (viewport state), которое задаёт то, как пользователь воспринимает карту в трёхмерном пространстве. Несмотря на то что базовая карта выглядит двумерной, фактически она работает в модели с перспективной проекцией, где ключевыми параметрами выступают latitude, longitude, zoom, pitch и bearing.

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


Базовые параметры viewport и их роль в перспективе

latitude и longitude

Координаты центра карты определяют точку фокусировки сцены.

  • latitude — широта центра
  • longitude — долгота центра

Эти значения не влияют напрямую на перспективу, но определяют, какая часть мира попадает в поле зрения камеры. При изменении угла обзора именно центральная точка становится осью вращения и наклона.


zoom как фактор глубины сцены

Параметр zoom управляет масштабом сцены и косвенно влияет на ощущение глубины.

  • низкий zoom → глобальный обзор, минимальная детализация
  • высокий zoom → локальная сцена с выраженной геометрией объектов

В контексте 3D-слоёв zoom также влияет на визуальное “сжатие” высотных данных: при увеличении масштаба extruded-объекты начинают восприниматься более рельефно.


Pitch: наклон камеры и переход в псевдо-3D

Параметр pitch задаёт угол наклона камеры относительно поверхности карты.

  • pitch = 0 → строго ортографический вид сверху
  • pitch > 0 → камера наклоняется, появляется перспектива
  • типичные значения для 3D-визуализации: 30–60°

В Kepler.gl pitch напрямую влияет на то, как отображаются:

  • extruded polygons (3D-полигоны)
  • heatmap с наклонной перспективой
  • arc layers (дуги перелётов)

При увеличении pitch усиливается эффект глубины за счёт перспективного искажения: дальние объекты визуально уменьшаются, ближние — увеличиваются.


Bearing: вращение карты и ориентация сцены

bearing отвечает за поворот карты вокруг вертикальной оси.

  • bearing = 0 → север направлен вверх
  • положительные значения → вращение по часовой стрелке
  • отрицательные → против часовой

В отличие от pitch, bearing не изменяет перспективу напрямую, но радикально влияет на восприятие направления потоков данных (например, транспортных маршрутов или миграций).

Комбинация pitch + bearing позволяет переходить от стандартной картографической ориентации к сценической визуализации, где карта воспринимается как 3D-сцена.


Взаимодействие pitch и zoom: формирование глубины

Перспектива в Kepler.gl формируется не одним параметром, а их комбинацией:

  • zoom определяет масштаб сцены
  • pitch определяет наклон плоскости
  • bearing задаёт ориентацию этой плоскости

При увеличении zoom эффект перспективы усиливается, особенно при ненулевом pitch. Это связано с тем, что визуальное расстояние между объектами растягивается, а высотные данные становятся более различимыми.


Программное управление камерой через mapState

В Kepler.gl состояние камеры хранится в структуре mapState, которая может быть изменена программно через Redux actions или через конфигурацию initial state.

Пример базовой структуры:

const mapState = {
  latitude: 55.751244,
  longitude: 37.618423,
  zoom: 10,
  pitch: 45,
  bearing: 0
};

Каждое изменение этого объекта приводит к перерасчёту камеры и перерисовке всех слоёв.


Динамическое управление углом обзора

Изменение pitch и bearing может быть анимированным, что позволяет создавать плавные переходы между режимами визуализации.

Пример постепенного наклона камеры

function tiltMap(state) {
  return {
    ...state,
    mapState: {
      ...state.mapState,
      pitch: 60
    }
  };
}

Вращение сцены

function rotateMap(state, angle) {
  return {
    ...state,
    mapState: {
      ...state.mapState,
      bearing: state.mapState.bearing + angle
    }
  };
}

Такие операции часто используются для создания эффектов “облёта” данных или автоматической презентации слоёв.


Ограничения и особенности перспективной модели

Перспектива в Kepler.gl имеет ряд технических ограничений:

  • pitch ограничен диапазоном (обычно 0–60/75° в зависимости от конфигурации)
  • экстремальные значения zoom могут искажать восприятие высотных данных
  • при высоком pitch увеличивается нагрузка на рендеринг WebGL

Также важно учитывать, что визуальная перспектива зависит от типа слоя. Например:

  • scatterplot layer поддерживает глубину через size + elevation
  • hexagon layer усиливает эффект высоты через extrusion
  • geojson layer требует явного включения 3D-режима

Связь камеры с WebGL-проекцией

В основе Kepler.gl лежит deck.gl, где камера реализуется через перспективную проекцию WebGL.

Параметры pitch и bearing трансформируются в матрицы:

  • projection matrix (перспектива)
  • view matrix (положение камеры)
  • model matrix (объекты слоя)

Таким образом, изменение одного параметра mapState приводит к пересчёту всей цепочки матриц, влияющих на финальный рендер сцены.


Управление камерой через пользовательские взаимодействия

Kepler.gl автоматически связывает UI-события с изменением mapState:

  • drag → изменение longitude/latitude
  • scroll → изменение zoom
  • right-drag → bearing
  • shift + drag → pitch

Эта модель позволяет пользователю переходить от 2D-навигации к 3D-навигации без переключения режимов.


Камера как часть аналитической сцены

Угол обзора в Kepler.gl используется не только для навигации, но и для анализа данных:

  • наклон (pitch) помогает визуально отделить плотные кластеры объектов
  • вращение (bearing) позволяет выровнять направления потоков
  • масштаб (zoom) переключает уровень агрегации данных

Комбинация этих параметров превращает карту в инструмент пространственного анализа, где геометрия сцены становится частью интерпретации данных.