Архитектура библиотеки

Kepler.gl построена как модульная геопространственная платформа визуализации, в которой объединены принципы декларативного описания состояния, реактивного UI и высокопроизводительного WebGL-рендеринга. Архитектура ориентирована на разделение ответственности между слоями управления состоянием, визуализации и взаимодействия с картографическим движком.

Ключевая идея — полное описание визуализации через сериализуемое состояние (state-driven visualization), где карта, слои, фильтры и стили являются производными от единого дерева состояния.


Базовый технологический стек

Ядро системы опирается на несколько фундаментальных технологий:

  • React — компонентный слой интерфейса
  • Redux — централизованное управление состоянием
  • deck.gl — высокопроизводительный рендеринг слоев
  • Mapbox GL JS — базовый картографический слой

Эти компоненты формируют многослойную архитектуру, в которой React отвечает за UI, Redux — за состояние, deck.gl — за визуализацию данных, а Mapbox GL JS — за базовую карту и проекцию.


Архитектура состояния

Состояние приложения организовано в виде нескольких доменов внутри единого Redux store. Каждый домен отвечает за определённую часть визуализации.

Основные сегменты store

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

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


visState: ядро визуализации

visState является центральным компонентом архитектуры, определяющим содержимое карты.

Структура visState

  • layers — набор визуальных слоёв
  • filters — фильтрация данных
  • interactionConfig — конфигурация взаимодействий
  • datasets — подключённые источники данных
  • animationConfig — управление временной динамикой

Логика слоёв

Каждый слой представляет собой декларативное описание поверх deck.gl слоя. Внутренне слой включает:

  • тип визуализации (scatter, arc, heatmap и др.)
  • ссылки на dataset
  • правила отображения (color, size, opacity)
  • вычисляемые поля

Слой не содержит императивной логики отрисовки — он лишь описывает параметры, которые затем транслируются в deck.gl.


mapState: управление картой

mapState управляет геометрией отображения:

  • latitude / longitude — центр карты
  • zoom — уровень приближения
  • bearing — поворот
  • pitch — наклон камеры

Эти параметры синхронизируются с Mapbox GL JS и могут изменяться как через UI, так и через внешние события (например, программно через API).


uiState: интерфейсный слой

uiState изолирует визуальную логику интерфейса:

  • состояние боковых панелей
  • выбранные вкладки
  • активные модальные окна
  • режимы взаимодействия (draw, select, edit)

Такое разделение предотвращает смешивание UI-логики с геопространственными вычислениями.


Слой визуализации и интеграция с deck.gl

Основной механизм отрисовки базируется на трансляции Redux-состояния в deck.gl слои.

Принцип работы

  1. visState формирует список слоёв
  2. каждый слой преобразуется в deck.gl Layer instance
  3. deck.gl объединяет слои в единый WebGL pipeline
  4. рендеринг выполняется через WebGL контекст

deck.gl обеспечивает:

  • батчинг данных
  • GPU-ускорение
  • оптимизацию перерисовок
  • пространственную индексацию

Поток данных

Архитектура построена на однонаправленном потоке данных:

  1. Импорт данных (CSV, GeoJSON, JSON)
  2. Нормализация dataset
  3. Создание visState слоёв
  4. Маппинг слоёв в deck.gl
  5. Рендеринг в WebGL
  6. Обработка событий взаимодействия
  7. Обновление Redux store

Любое изменение UI или данных инициирует повторный проход этого цикла.


Модель данных и нормализация

Данные внутри системы хранятся в нормализованном виде:

  • datasets разделены по идентификаторам
  • строки данных индексируются
  • вычисляемые поля кешируются

Это позволяет:

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

Система фильтрации

Фильтры реализованы как независимые сущности внутри visState.

Каждый фильтр включает:

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

Фильтрация применяется до этапа передачи данных в deck.gl, что снижает нагрузку на GPU.


Механизм взаимодействий

interactionConfig определяет поведение пользовательских действий:

  • hover
  • click
  • brush selection
  • tooltip rendering

События обрабатываются на уровне deck.gl и транслируются обратно в Redux actions, что обеспечивает замкнутый цикл взаимодействия.


Система сериализации

Kepler.gl поддерживает полную сериализацию состояния:

  • mapState
  • visState
  • uiState
  • mapStyle

Это позволяет сохранять и восстанавливать визуализации как JSON-снимки.

Сериализация используется для:

  • сохранения проектов
  • обмена конфигурациями
  • встраивания визуализаций

Архитектура расширяемости

Система расширяется через:

  • кастомные слои deck.gl
  • пользовательские reducers
  • плагины UI
  • внешние data processors

Каждый новый слой интегрируется через абстракцию layer factory, которая преобразует конфигурацию в deck.gl объект.


Рендеринг и оптимизация производительности

Основные оптимизационные стратегии:

  • GPU batching через deck.gl
  • memoization вычисляемых полей
  • lazy recalculation фильтров
  • минимизация Redux updates
  • spatial indexing для больших dataset

При больших объёмах данных применяется агрегация и кластеризация на уровне слоя.


Структура кодовой базы

Типовая организация модулей:

  • reducers/

    • vis-state
    • map-state
    • ui-state
  • components/

    • map-container
    • side-panel
  • layers/

    • layer-factories
  • processors/

    • data-parsers
  • schemas/

    • serialization
  • utils/

    • geo-helpers

Event-driven архитектура

Система событий построена на Redux actions:

  • ADD_DATASET
  • UPDATE_LAYER
  • SET_FILTER
  • UPDATE_MAP_STATE
  • TOGGLE_UI_PANEL

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

  • логирование
  • валидация данных
  • синхронизация состояния

Связь React и Redux слоя

React компоненты не содержат бизнес-логики визуализации. Они:

  • подписываются на Redux store
  • отображают состояние
  • диспатчат actions

Это обеспечивает строгую унификацию и предсказуемость UI.


Геометрическая проекция и карта

Mapbox GL JS отвечает за:

  • проекцию координат
  • управление тайлами
  • базовый рендер карты

deck.gl использует ту же проекцию, что обеспечивает точное наложение слоёв поверх карты без расхождений координат.


Итоговая композиция архитектуры

Архитектура формируется как многослойная система:

  • UI слой (React)
  • State слой (Redux)
  • Visualization layer (deck.gl)
  • Map engine (Mapbox GL JS)
  • Data pipeline (processors + reducers)

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