Взаимосвязь Kepler.gl и deck.gl

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


Базовая роль deck.gl в экосистеме Kepler.gl

deck.gl выполняет в Kepler.gl три ключевые функции:

  • управление WebGL-рендерингом
  • предоставление набора геопространственных слоёв
  • оптимизация работы с большими массивами данных на GPU

Kepler.gl не реализует собственный рендеринг. Вместо этого он формирует декларативное описание визуализации, которое затем транслируется в объекты deck.gl.

Каждый слой Kepler.gl в конечном итоге становится экземпляром слоя deck.gl, например:

  • ScatterplotLayer
  • LineLayer
  • ArcLayer
  • HexagonLayer
  • PolygonLayer

Декларативная модель Kepler.gl и трансляция в deck.gl

Kepler.gl использует декларативный подход: визуализация описывается как JSON-структура состояния (visState), где задаются:

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

Эта структура не привязана к WebGL напрямую. Она преобразуется в конфигурацию deck.gl через слой адаптации.

Процесс можно описать цепочкой:

данные → visState Kepler.gl → фабрика слоёв → экземпляры deck.gl → WebGL сцена

Ключевой момент: Kepler.gl не «рисует», он описывает, что должно быть нарисовано, а deck.gl выполняет рендеринг.


Система слоёв: соответствие Kepler.gl и deck.gl

Каждый слой Kepler.gl является обёрткой над одним или несколькими слоями deck.gl.

Примеры соответствий:

  • Точечный слой Kepler.gl → ScatterplotLayer deck.gl

  • Линейный слой → LineLayer или PathLayer

  • Геошестиугольники → HexagonLayer

  • Кластеры → ScreenGridLayer или кастомная агрегация поверх deck.gl

  • 3D полигоны → PolygonLayer с extruded rendering

Kepler.gl добавляет надстройки:

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

deck.gl при этом остаётся ответственным только за отрисовку.


Управление состоянием: связующее звено между слоями

Kepler.gl вводит собственную архитектуру состояния, построенную вокруг Redux-подобной модели.

Основные блоки состояния:

  • datasets — загруженные данные
  • layers — конфигурации слоёв
  • filters — фильтрация данных
  • interactionConfig — интерактивность
  • mapState — положение карты

deck.gl не управляет состоянием приложения. Он получает уже подготовленные props от Kepler.gl и пересоздаёт или обновляет слои.

Таким образом:

  • Kepler.gl управляет логикой и состоянием
  • deck.gl выполняет визуализацию состояния

Механизм обновления визуализации

Изменения в Kepler.gl проходят следующий путь:

  1. Пользователь изменяет фильтр или стиль слоя
  2. Обновляется visState
  3. Генерируется новый набор props для deck.gl
  4. deck.gl сравнивает слои (diffing)
  5. Обновляются только изменённые GPU-объекты

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


Интеграция через React-компоненты

Kepler.gl предоставляет React-компонентную обёртку, которая инкапсулирует deck.gl canvas.

Внутри используется следующий принцип:

  • React-компонент KeplerGl
  • внутри него экземпляр deck.gl
  • props из Redux store передаются в deck.gl

deck.gl при этом остаётся независимым от React, что позволяет:

  • использовать его отдельно
  • интегрировать в другие фреймворки
  • применять в headless-режиме

Kepler.gl лишь связывает React-экосистему с WebGL-слоем deck.gl.


Кастомные слои Kepler.gl поверх deck.gl

Kepler.gl расширяет deck.gl, добавляя собственные слои, которые наследуются от базовых классов deck.gl.

Такие слои:

  • добавляют специфическую гео-логику
  • реализуют агрегации
  • управляют визуальными кодировками
  • оптимизируют работу с CSV/GeoJSON/JSON

Пример архитектуры кастомного слоя:

  • базовый класс deck.gl Layer
  • расширение Kepler.gl CustomKeplerLayer
  • логика трансформации данных
  • передача результата в GPU слой

Это позволяет Kepler.gl не ограничиваться стандартным набором deck.gl и расширять функциональность под аналитические задачи.


GPU-вычисления и производительность

deck.gl обеспечивает аппаратное ускорение через WebGL, а Kepler.gl использует это следующим образом:

  • фильтрация выполняется частично на CPU, частично на GPU
  • агрегации (например, hexbin) выполняются в оптимизированных слоях deck.gl
  • рендеринг больших наборов точек происходит без деградации UI

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


Поток данных между Kepler.gl и deck.gl

Общая схема взаимодействия:

  • загрузка данных (CSV, GeoJSON, API)
  • нормализация Kepler.gl
  • создание dataset model
  • формирование layer config
  • трансформация в deck.gl layers
  • рендеринг через WebGL

Важно, что deck.gl не знает о формате исходных данных — он получает уже подготовленные массивы координат и атрибутов.


Синхронизация камеры и взаимодействий

deck.gl предоставляет механизмы управления камерой (view state), которые Kepler.gl использует для:

  • панорамирования карты
  • зума
  • вращения
  • наклона

Kepler.gl синхронизирует mapState с deck.gl viewState.

Любое изменение камеры проходит обратный цикл:

  • deck.gl обновляет viewState
  • Kepler.gl сохраняет его в store
  • UI синхронизируется с новым состоянием

Расширяемость через API deck.gl

Kepler.gl сохраняет возможность прямого использования API deck.gl:

  • кастомные слои можно внедрять без переписывания ядра
  • shader overrides позволяют модифицировать визуализацию
  • можно комбинировать стандартные и пользовательские слои

Это делает Kepler.gl не заменой deck.gl, а надстройкой, которая сохраняет доступ к низкоуровневым возможностям.


Роль shader-пайплайна deck.gl в Kepler.gl

deck.gl использует GLSL-шейдеры для рендеринга данных. Kepler.gl влияет на них косвенно:

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

Shader layer остаётся неизменным, но входные данные формируются Kepler.gl.

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


Разделение ответственности между библиотеками

Архитектурное разделение можно сформулировать следующим образом:

Kepler.gl отвечает за:

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

deck.gl отвечает за:

  • WebGL-рендеринг
  • GPU-оптимизацию
  • работу слоёв на низком уровне
  • управление сценой

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