Интерфейсы

Интерфейс в Kepler.gl строится вокруг связки трёх уровней состояния: mapState, visState и uiState. Такое разделение позволяет изолировать геометрию карты, визуальные слои и пользовательские элементы управления, сохраняя предсказуемость поведения при масштабировании приложения и обработке больших геоданных.


Интерфейс Kepler.gl не является монолитным React-компонентом. Он формируется как композиция визуальных панелей, подключённых к централизованному хранилищу состояния (Redux). Каждый элемент UI синхронизирован с конкретной частью состояния:

  • mapState — положение карты, масштаб, поворот, центрирование
  • visState — слои, фильтры, данные, стили визуализации
  • uiState — состояние интерфейса: открытые панели, модальные окна, режимы взаимодействия

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


Основная карта как интерфейсный контейнер

Центральным элементом является MapContainer, который инкапсулирует WebGL-рендеринг через deck.gl.

Каркас взаимодействия строится следующим образом:

  • MapContainer получает mapState
  • передаёт параметры в deck.gl viewState
  • синхронизирует события перемещения обратно в Redux
  • обеспечивает согласованность между UI и визуализацией

Интерфейс карты не ограничивается визуализацией — он также является входной точкой для всех событий: зум, drag, rotate, selection box.


Панель слоёв (Layers Panel)

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

  • точечные слои (PointLayer)
  • кластеризация (ClusterLayer)
  • тепловые карты (HeatmapLayer)
  • полигональные слои (PolygonLayer)
  • arc и line визуализации

Интерфейс слоя включает:

  • переключатель видимости
  • настройки цвета
  • выбор поля данных
  • параметры агрегации
  • настройки масштаба отображения

Каждое изменение в панели напрямую мутирует visState.layers, что вызывает перерасчёт WebGL-слоя без перезагрузки всей сцены.


Редактор данных слоя

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

Основные интерфейсные элементы редактора:

  • выбор dataset
  • mapping полей (latitude, longitude, altitude)
  • настройка color scale
  • выбор функции агрегации (count, sum, average)
  • фильтрация значений

Редактор не оперирует геометрией напрямую, а изменяет абстрактное описание слоя, которое затем интерпретируется движком рендеринга.


Панель фильтров (Filters Panel)

Фильтры являются отдельным интерфейсным уровнем, работающим поверх слоёв. Каждый фильтр привязан к полю данных и типу значения:

  • числовые диапазоны (slider)
  • временные интервалы (time range)
  • категориальные фильтры (multi-select)
  • логические условия

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

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


Панель управления картой (Map Controls)

Элементы управления картой включают:

  • переключение стиля карты (light, dark, satellite)
  • управление 3D-режимом
  • настройка наклона (pitch)
  • вращение (bearing)
  • управление масштабом

Эти элементы изменяют mapState и немедленно отражаются в viewState deck.gl.

Важный аспект интерфейса — отсутствие задержки между пользовательским действием и визуальным обновлением сцены.


Tooltip и система подсказок

Tooltip-интерфейс в Kepler.gl работает на основе событий hover и click.

Поток взаимодействия:

  1. пользователь наводит курсор на объект
  2. deck.gl возвращает picking info
  3. UI слой интерпретирует объект
  4. формируется tooltip с данными слоя

Содержимое tooltip зависит от конфигурации слоя и может включать:

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

Tooltip не является статическим компонентом — он генерируется динамически на основе visState.


Интерфейс выбора и выделения объектов

Selection UI реализует механизмы:

  • box selection (выделение прямоугольником)
  • point selection
  • polygon selection (в расширенных конфигурациях)

Выделение влияет на visState.interactionConfig, где хранится состояние выбранных объектов.

Результатом становится:

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

Панель временной анимации

Если данные содержат временное измерение, интерфейс активирует time playback control.

Элементы управления:

  • play / pause
  • шаг временной шкалы
  • скорость воспроизведения
  • диапазон времени

Внутренне это управляет фильтром времени, который пересчитывает набор данных для каждого кадра анимации.

Интерфейс синхронизирован с visState.filters, что позволяет интегрировать временные данные с другими фильтрами.


UI State и управление модальными окнами

uiState отвечает за поведение интерфейса, не связанное напрямую с данными:

  • открытие/закрытие панелей
  • состояние сайдбара
  • модальные окна загрузки данных
  • конфигурация layout

Примеры:

  • exportModalOpen
  • datasetModalVisible
  • layerPanelCollapsed

Этот слой важен для обеспечения независимости UI от данных визуализации.


Интерфейс загрузки данных

Компонент загрузки данных поддерживает несколько источников:

  • CSV
  • GeoJSON
  • JSON
  • API endpoints

Интерфейс включает:

  • drag-and-drop область
  • preview таблицы
  • автоопределение типов данных
  • маппинг колонок

После загрузки данные преобразуются в dataset, который добавляется в visState.datasets.


Панель экспорта

Экспортный интерфейс позволяет сохранять результат в различных форматах:

  • изображение карты
  • JSON конфигурация
  • HTML-встраивание
  • геоданные

Интерфейс экспорта тесно связан с состоянием приложения: сохраняется не только визуальный результат, но и полная конфигурация visState + mapState + uiState.


Взаимодействие интерфейсов через события

Kepler.gl использует событийную модель, в которой UI-компоненты не взаимодействуют напрямую. Вместо этого применяется поток:

UI Action → Redux Action → State Update → Re-render → UI Sync

Типичные события:

  • ADD_LAYER
  • UPDATE_FILTER
  • SET_MAP_VIEW
  • TOGGLE_UI_ELEMENT

Такой подход предотвращает рассинхронизацию интерфейса при сложных взаимодействиях.


Адаптивность интерфейса

Интерфейс Kepler.gl поддерживает адаптацию под разные размеры экранов:

  • скрытие панелей при малой ширине
  • переключение layout sidebar/topbar
  • изменение плотности элементов управления

Адаптивность реализуется через uiState и CSS-grid структуру компонентов.


Интеграция интерфейса в сторонние приложения

Kepler.gl может быть встроен как компонент React-приложения. Интерфейс встраивания позволяет:

  • передавать dataset извне
  • управлять состоянием через props
  • переопределять UI компоненты
  • отключать отдельные панели

Таким образом интерфейс становится конфигурируемым слоем поверх геовизуализации, а не фиксированным приложением.