Управление разделением

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

С точки зрения внутренней структуры состояние приложения делится на три ключевых блока:

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

Разделение реализуется как расширение uiState, при котором создаются два или более независимых viewport’а, связанных общим или частично общим состоянием.


Режимы разделения карты

Двойной экран (Split View)

Основной режим разделения — отображение двух карт рядом. Каждая карта имеет собственный viewport, но может наследовать глобальные параметры.

Ключевые характеристики:

  • независимый zoom и pan
  • возможность синхронизации камеры
  • различающиеся наборы слоёв
  • сравнение разных датасетов

Логически это представляется как:

  • leftMap
  • rightMap

Оба контейнера используют общий store, но читают разные сегменты состояния.


Сравнение слоёв (Layer Comparison Mode)

В этом режиме разделение происходит не по карте, а по слоям данных. Один и тот же слой может быть:

  • показан только слева
  • только справа
  • либо синхронно в обоих окнах

Такой подход используется для анализа различий визуализации, например:

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

Разделение по фильтрам

Фильтрация является одним из ключевых механизмов разделения данных внутри Kepler.gl. При включённом split-view фильтры могут:

  • применяться глобально (оба окна)
  • применяться локально (только одно окно)

Каждый фильтр имеет контекст привязки:

  • global scope
  • viewport scope

Это позволяет строить аналитические сценарии вида:

  • слева — полные данные
  • справа — подмножество по условию

Управление состоянием split-view

Конфигурация uiState

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

Типовая структура включает:

  • активирован ли split-view
  • ориентация разделения (горизонтальная / вертикальная)
  • синхронизация взаимодействий
  • привязка камер

Пример логики состояния:

const initialState = {
  uiState: {
    splitMaps: true,
    splitMapView: 'horizontal',
    syncLeftRightMaps: false
  }
}

Синхронизация viewport’ов

Одним из ключевых механизмов является синхронизация параметров mapState.

Возможные режимы:

  • полная синхронизация (zoom + pan + rotation)
  • частичная (только zoom)
  • отсутствие синхронизации

При синхронном режиме любое изменение одной карты диспатчит обновление второй:

if (syncMaps) {
  leftMapState -> rightMapState
}

Это обеспечивает единое пространственное восприятие при сравнении данных.


Независимость visState в разделённых режимах

Несмотря на общую архитектуру, visState может быть разделён логически:

  • общий набор слоёв
  • раздельная активация слоёв
  • разные стили одного слоя
  • разные фильтры

Каждый слой содержит параметры видимости, которые могут быть переопределены для конкретного viewport.

Пример логики:

  • Layer A → visible in left only
  • Layer B → visible in both
  • Layer C → visible in right only

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


Разделение через несколько инстансов карты

Помимо встроенного split-view, возможна реализация через два независимых экземпляра Kepler.gl.

В этом случае:

  • создаются два store или два slice состояния
  • данные синхронизируются вручную
  • взаимодействия полностью контролируются приложением

Такой подход используется при необходимости:

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

Синхронизация взаимодействий пользователя

В режиме разделения важную роль играет синхронизация событий:

  • перемещение карты
  • изменение масштаба
  • выбор объектов
  • применение фильтров

События могут быть:

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

Механизм событий опирается на единый event dispatcher, который распределяет действия между viewport’ами.


Управление временем в split-view

При работе с временными данными split-view часто используется для сравнения разных периодов.

Основные стратегии:

  • синхронная временная шкала
  • независимые временные фильтры
  • фиксированные временные срезы

Каждый viewport может иметь собственный временной фильтр, даже если геометрия данных идентична.


Работа с проекциями в разделённом режиме

kepler.gl поддерживает разные проекции, и в split-view возможно:

  • использование одинаковой проекции
  • сравнение разных проекций
  • переключение между 2D и 3D режимами отдельно

Это особенно важно при анализе:

  • плотности данных
  • высотных моделей
  • маршрутов и потоков

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

При работе с разделением существуют технические ограничения:

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

Кроме того, некоторые операции могут быть глобальными по умолчанию:

  • загрузка датасета
  • удаление слоя
  • изменение глобальных настроек темы

Практическая модель состояния split-view

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

  • глобальные данные (datasets)

  • глобальные слои (visState.layers)

  • два viewport’а:

    • viewport A (left)
    • viewport B (right)
  • правила синхронизации:

    • map sync rules
    • filter sync rules
    • interaction sync rules

Такое разделение позволяет рассматривать Kepler.gl не как одну карту, а как систему параллельных визуальных пространств, работающих на общем наборе данных.