Программное управление взаимодействием

Работа с Kepler.gl на уровне программного управления взаимодействием строится вокруг принципа полного контроля над состоянием карты через внешние события, Redux-поток и декларативные обновления состояния. Интерфейс библиотеки изначально проектируется как управляемый компонент, где любое пользовательское действие может быть воспроизведено или изменено программно.

Система взаимодействий в Kepler.gl опирается на централизованное состояние, разделённое на несколько ключевых доменов:

  • состояние представления карты (view state)
  • состояние слоёв (layers)
  • фильтры (filters)
  • интерактивные состояния (interaction state)
  • выделения и ховер (selection / hover)

Каждое из этих состояний может изменяться как через UI, так и через диспатч Redux-экшенов. Это позволяет полностью дублировать пользовательское поведение программными средствами.

Интерактивный слой Kepler.gl интегрирован через Redux reducer, предоставляемый библиотекой, что делает возможным вмешательство в каждый этап обработки событий.

Базовый принцип программного управления

Основной механизм управления взаимодействием — dispatch действий в Redux store, созданный через reducer Kepler.gl.

import keplerGlReducer from '@kepler.gl/reducers';
import {createStore, combineReducers, applyMiddleware} from 'redux';

const reducers = combineReducers({
  keplerGl: keplerGlReducer
});

const store = createStore(reducers, {}, applyMiddleware());

Любое взаимодействие с картой становится результатом изменения состояния:

  • изменение позиции карты
  • изменение активного слоя
  • включение фильтра
  • управление tooltip
  • управление hover state

Управление состоянием viewState

ViewState отвечает за позицию камеры: центр карты, масштаб, наклон и вращение.

Программное изменение реализуется через action обновления состояния:

import {updateMap} from '@kepler.gl/actions';

store.dispatch(updateMap({
  latitude: 55.751244,
  longitude: 37.618423,
  zoom: 10,
  bearing: 0,
  pitch: 0
}));

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

  • внешнем контроле навигации
  • воспроизведении маршрутов движения
  • анимации камеры
  • привязке к UI вне карты

Состояние viewState может обновляться непрерывно, что позволяет реализовывать кастомные анимации перемещения камеры через последовательные dispatch.

Программное управление hover и tooltip

Hover-состояние формируется при наведении курсора на объекты слоя. В программной модели оно представлено структурой, содержащей:

  • объект данных
  • слой
  • координаты события

Прямое управление hover возможно через экшен setHoverData.

import {actionCreators} from '@kepler.gl/actions';

store.dispatch(actionCreators.setHoverData({
  x: 120,
  y: 200,
  object: {
    id: 1,
    name: 'Feature A'
  },
  layer: 'points-layer'
}));

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

  • эмулировать наведение
  • фиксировать tooltip без пользовательского ввода
  • интегрировать внешние события (например, выбор из списка)

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

Управление кликами и selection state

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

Программное выделение:

store.dispatch(actionCreators.selectFeature({
  layerId: 'points-layer',
  objectId: 'feature-123'
}));

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

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

Отдельно поддерживается мультивыбор, если слой и конфигурация допускают множественные selection state.

Контроль фильтров через код

Фильтры в Kepler.gl представляют собой отдельный массив объектов состояния, каждый из которых описывает:

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

Обновление фильтров осуществляется через действие updateFilter.

import {updateFilter} from '@kepler.gl/actions';

store.dispatch(updateFilter('filter_1', {
  name: 'speed',
  value: [10, 80]
}));

Программное управление фильтрацией используется в сценариях:

  • динамическая аналитика данных
  • синхронизация с временными шкалами
  • внешние контроллеры (slider, input, API)

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

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

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

Экспорт состояния:

const mapConfig = store.getState().keplerGl.map.visState;

Импорт состояния:

import {loadDataset} from '@kepler.gl/actions';

store.dispatch(loadDataset({
  data: dataset,
  config: mapConfig
}));

Этот механизм используется для:

  • восстановления сессий
  • загрузки шаблонов визуализаций
  • переключения режимов анализа

Управление слоями и их активностью

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

Операции:

  • добавление слоя
  • удаление слоя
  • изменение видимости
  • обновление стиля

Пример переключения видимости:

store.dispatch(actionCreators.toggleLayer('layer_id'));

Изменение параметров слоя:

store.dispatch(actionCreators.updateLayerConfig({
  layerId: 'layer_id',
  config: {
    color: [255, 0, 0],
    opacity: 0.5
  }
}));

Такая модель позволяет реализовать:

  • адаптивные визуализации
  • тематическое переключение отображения
  • реакцию на внешние события (API, WebSocket)

Программная синхронизация событий карты

Все события карты могут быть перехвачены через middleware Redux или подписку на store.

Пример подписки:

store.subscribe(() => {
  const state = store.getState();
  const hover = state.keplerGl.map.uiState.hoverInfo;
});

Таким образом строится реактивная модель, где внешняя логика реагирует на изменения состояния карты.

Дополнительно возможно создание middleware для логирования или трансформации событий до их применения.

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

Kepler.gl допускает интеграцию внешних событий, которые преобразуются в действия Redux.

Пример интеграции DOM-события:

button.addEventListener('click', () => {
  store.dispatch(actionCreators.setFilterAnimationTime(Date.now()));
});

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

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

Программное управление режимами взаимодействия

Режимы взаимодействия включают:

  • drag rotation
  • zoom behavior
  • selection mode
  • tooltip behavior

Некоторые параметры управляются через UI state:

store.dispatch(actionCreators.togglePerspective());

или через конфигурацию компонента:

<KeplerGl
  mapboxApiAccessToken={token}
  width={width}
  height={height}
  appState={{
    dragRotate: false,
    readOnly: false
  }}
/>

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

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

В реальных сценариях взаимодействия редко изолированы. Hover, filter и selection могут изменяться одновременно.

Пример комбинированного сценария:

store.dispatch(actionCreators.setFilter('filter_1', {
  value: [20, 50]
}));

store.dispatch(actionCreators.setHoverData({
  object: feature
}));

store.dispatch(actionCreators.selectFeature({
  layerId: 'layer_1',
  objectId: feature.id
}));

Синхронное управление позволяет реализовывать:

  • интерактивные таймлайны
  • guided analytics
  • сценарии воспроизведения данных

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

При интеграции с потоками данных (WebSocket, Kafka, REST polling) взаимодействия становятся реакцией на приходящие события.

Каждое событие может трансформироваться в action:

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

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