В основе Kepler.gl лежит архитектура управления состоянием, построенная вокруг Redux-подобного потока данных, где центральную роль играет диспетчеризация действий (dispatch). Все изменения визуализации, загрузка данных, конфигурация слоёв, фильтров и интерактивных элементов проходят через единый механизм action → reducer → state.
Kepler.gl структурирует состояние в несколько ключевых доменов:
visState, mapState, uiState,
mapStyle. Каждый из них обновляется исключительно через
действия, поступающие в store, что обеспечивает предсказуемость
поведения и воспроизводимость визуализаций.
Диспетчеризация в Kepler.gl не является второстепенной деталью реализации — она формирует основной контракт между пользовательским интерфейсом, данными и визуальным движком deck.gl.
Любое изменение в приложении Kepler.gl проходит через единый цикл:
dispatch(action)Каждое действие представляет собой объект с обязательным полем
type и дополнительным payload, зависящим от конкретной
операции.
Пример логики:
addDataToMaplayerConfigChangefilterUpdatetoggleModalДействия Kepler.gl следуют стандартному контракту Redux:
{
type: 'ACTION_TYPE',
payload: { ...данные },
meta: { ...служебная информация }
}
Однако в Kepler.gl часто используется более богатая структура payload, включающая:
Пример добавления данных:
dispatch(addDataToMap({
datasets: {
info: {
label: 'dataset',
id: 'sample_data'
},
data: geojsonData
},
options: {
centerMap: true,
readOnly: false
}
}));
Диспетчеризация охватывает несколько категорий действий, каждая из которых воздействует на определённый слой состояния.
addDataToMapremoveDatasetupdateTableColorsetFilterЭти действия инициируют загрузку, удаление и трансформацию геоданных.
Они напрямую влияют на visState.datasets.
layerConfigChangelayerTypeChangetoggleLayerreorderLayerЭти действия изменяют параметры deck.gl слоёв, включая их типы, стили и порядок отрисовки.
Фильтрация реализована через отдельный сегмент состояния:
filterUpdateaddFilterremoveFilteranimationConfigChangeКаждое действие модифицирует набор фильтров, применяемых к данным перед визуализацией.
toggleSidePanelupdateMapControlshowModalhideModalUI-диспетчеризация отделена от визуальных данных, но может влиять на отображение слоёв и конфигураций.
Центральная точка диспетчеризации — Redux store, переданный через
провайдер или HOC KeplerGl.
Каждый action проходит следующий путь:
Компонент вызывает action creator
Action передаётся в dispatch
Middleware (если подключены) перехватывают действие
Root reducer делегирует обработку подредьюсерам:
visStateReducermapStateReduceruiStateReducerНовый state возвращается в store
React-компоненты получают обновление через
connect
Особенность Kepler.gl заключается в том, что часть логики обработки данных выполняется до попадания в reducer, в специализированных утилитах трансформации данных.
Kepler.gl предоставляет набор встроенных action creators, инкапсулирующих структуру действий.
Примеры:
import KeplerGl from 'kepler.gl';
import { addDataToMap, updateMap } from 'kepler.gl/actions';
Основной механизм загрузки данных и их первичной инициализации:
Используется для массового обновления состояния карты:
Действие тонкой настройки слоя:
visState является наиболее чувствительным к действиям
сегментом состояния.
Любое действие, связанное с визуализацией, проходит через строгую цепочку:
Особенность Kepler.gl заключается в том, что изменения visState могут инициировать каскадные обновления, включая пересборку геометрии и перерасчёт агрегаций.
Kepler.gl допускает использование middleware между dispatch и reducer. Это позволяет:
Пример middleware-потока:
const loggerMiddleware = store => next => action => {
console.log(action.type);
return next(action);
};
Middleware особенно важны при работе с потоковыми данными или внешними API, где требуется контроль последовательности dispatch.
Несмотря на синхронную природу Redux reducer’ов, Kepler.gl поддерживает асинхронные действия через thunk-подобные механизмы.
Пример:
dispatch(async (dispatch) => {
const data = await fetch(url).then(r => r.json());
dispatch(addDataToMap({ datasets: data }));
});
Асинхронный слой часто используется при интеграции с внешними источниками геоданных.
Kepler.gl допускает внедрение пользовательских action types, которые обрабатываются расширенными reducer’ами.
Применение:
Пример структуры:
const CUSTOM_ACTION = 'CUSTOM_ACTION';
function customAction(payload) {
return {
type: CUSTOM_ACTION,
payload
};
}
Для корректной работы требуется расширение root reducer и подключение дополнительной логики обработки.
Kepler.gl обычно используется через React-компонент:
<KeplerGl
id="map"
width={width}
height={height}
mapboxApiAccessToken={token}
/>
Компонент подключается к Redux store и автоматически получает доступ к dispatch. Любые действия из интерфейса (перетаскивание слоёв, изменение фильтров) транслируются в dispatch-события.
Связка реализуется через connect:
Некоторые действия в Kepler.gl являются композиционными. Например,
addDataToMap инициирует сразу несколько внутренних
dispatch:
Это превращает одно действие в цепочку внутренних событий, что важно учитывать при отладке и профилировании.
Типовые проблемы в системе dispatch:
Диагностика осуществляется через:
Особое внимание требуется при работе с большими геоданными, где один dispatch может приводить к значительной нагрузке на перерасчёт слоёв.
Kepler.gl следует принципу строгой однонаправленной архитектуры, где:
Такой подход обеспечивает детерминированность и масштабируемость при работе с геопространственными данными и интерактивными картами.