Kepler.gl представляет собой высокопроизводительную библиотеку для геовизуализации, построенную на базе Mapbox GL и deck.gl, и распространяемую как React-компонент с внутренним управлением состоянием через Redux. Встраивание компонента KeplerGl в приложение означает интеграцию полноценного визуального движка, способного отображать миллионы геоточек и выполнять агрегации данных в реальном времени (docs.kepler.gl).
KeplerGl экспортируется как стандартный React-компонент, который подключается в JSX-структуру приложения. Его основная задача — рендер интерактивной карты с наложением слоёв данных, фильтрами и визуальными конфигурациями. Компонент требует обязательного подключения Mapbox токена, поскольку базовая подложка карты строится на Mapbox GL.
Минимальная структура подключения выглядит следующим образом:
import KeplerGl from '@kepler.gl/components';
const Map = ({ width, height, token }) => (
<KeplerGl
id="map"
width={width}
height={height}
mapboxApiAccessToken={token}
/>
);
Идентификатор id играет ключевую роль: он связывает
конкретный экземпляр компонента с соответствующей частью состояния
Redux. При наличии нескольких карт в одном приложении каждый экземпляр
обязан иметь уникальный id, иначе произойдёт конфликт
состояния.
KeplerGl не является изолированным UI-компонентом. Он полностью зависит от Redux-хранилища, где хранится:
Для корректной работы требуется подключение редьюсера kepler.gl:
import { combineReducers, createStore, applyMiddleware } from 'redux';
import keplerGlReducer from '@kepler.gl/reducers';
import { taskMiddleware } from 'react-palm/tasks';
const rootReducer = combineReducers({
keplerGl: keplerGlReducer,
});
const store = createStore(rootReducer, {}, applyMiddleware(taskMiddleware));
Middleware react-palm используется для обработки
асинхронных задач и побочных эффектов, связанных с загрузкой и
обработкой данных внутри KeplerGl.
Каждый экземпляр KeplerGl обращается к своему сегменту Redux-дерева:
state.keplerGl[props.id]
Это означает, что изменение id фактически переключает
источник данных, визуализации и настроек.
Дополнительно можно указать функцию getState, если
редьюсер интегрирован не в корень состояния:
<KeplerGl
id="map"
getState={state => state.visualization.keplerGl}
/>
Это критически важно при интеграции в сложные приложения с несколькими слоями состояния.
Компонент сам по себе не отображает данные без их явной передачи
через action addDataToMap. Данные должны быть
структурированы как dataset с метаданными:
import { addDataToMap } from '@kepler.gl/actions';
dispatch(
addDataToMap({
datasets: {
info: {
label: 'Dataset',
id: 'data_1'
},
data: rawData
},
option: {
centerMap: true
}
})
);
После выполнения этого action данные попадают в
visState, где проходят обработку и становятся доступными
для визуальных слоёв.
Состояние KeplerGl можно условно разделить на три основные части:
Отвечает за:
Содержит параметры карты:
Управляет интерфейсом:
Эта структура делает KeplerGl не просто картографическим компонентом, а полноценной визуальной системой поверх Redux.
KeplerGl поддерживает настройку темы интерфейса через проп
theme или через styled-components
ThemeProvider. Это позволяет переопределять стили панели, текста и
элементов управления.
const theme = {
sidePanelBg: '#ffffff',
titleTextColor: '#000000',
sidePanelHeaderBg: '#f7f7f7'
};
<KeplerGl
id="map"
width={800}
height={600}
theme={theme}
/>
При использовании ThemeProvider стили распространяются глобально на все компоненты KeplerGl внутри дерева React.
Одной из ключевых особенностей KeplerGl является система внедрения компонентов. Она позволяет заменять внутренние UI-элементы без изменения исходного кода библиотеки.
import { injectComponents, PanelHeaderFactory } from '@kepler.gl/components';
const CustomHeader = () => <div>Custom header</div>;
const KeplerGlCustom = injectComponents([
[PanelHeaderFactory, () => CustomHeader]
]);
После этого стандартный заголовок панели будет заменён на кастомный компонент.
При использовании нескольких карт на одной странице важно соблюдать
изоляцию состояния. Каждый компонент должен иметь уникальный
id, иначе все действия (загрузка данных, фильтры, стили)
будут применяться ко всем экземплярам одновременно.
<KeplerGl id="mapA" />
<KeplerGl id="mapB" />
Каждый из них будет иметь собственный независимый state slice в Redux.
Типичный жизненный цикл данных выглядит следующим образом:
addDataToMap.visState.Эта цепочка обеспечивает реактивное обновление визуализации без ручного управления рендерингом.
KeplerGl использует deck.gl для WebGL-рендеринга, что позволяет:
React-компонент здесь выполняет роль управляющего слоя, а не прямого рендерера графики.
Любое взаимодействие с картой осуществляется через actions:
Это делает KeplerGl предсказуемым с точки зрения архитектуры: любое изменение состояния можно отследить через Redux flow.
В крупных приложениях KeplerGl часто интегрируется не в корневой
Redux store. В таких случаях используется функция getState,
которая указывает путь к состоянию компонента внутри глобального
дерева.
Это позволяет встроить KeplerGl в:
Структура KeplerGl как React-компонента опирается на сочетание Redux-архитектуры, WebGL-рендеринга и декларативного UI, что делает его не просто картографическим виджетом, а полноценным визуальным движком внутри React-приложений.