Интеграция Kepler.gl в уже существующий проект почти всегда сводится к аккуратному встраиванию его Redux-слоя и React-компонента в текущую архитектуру приложения. Библиотека построена вокруг состояния, поэтому ключевая задача — не конфликтовать с уже существующим store и корректно подключить редьюсеры и middleware.
Базовая точка входа — установка зависимостей:
npm install kepler.gl react-map-gl mapbox-gl redux react-redux
Kepler.gl опирается на react-map-gl и Mapbox (или
альтернативные tile-сервисы), поэтому важно заранее учитывать требования
к токенам и конфигурации карт.
Если проект уже использует Redux, Kepler.gl интегрируется как дополнительный редьюсер:
import { createStore, combineReducers, applyMiddleware } from 'redux';
import keplerGlReducer from 'kepler.gl/reducers';
const rootReducer = combineReducers({
keplerGl: keplerGlReducer,
// другие редьюсеры приложения
});
const store = createStore(rootReducer, applyMiddleware(/* middleware */));
Критический момент — ключ keplerGl должен быть сохранён,
так как внутренняя логика библиотеки ожидает именно такую структуру
состояния.
Kepler.gl использует набор action creators, работающих с асинхронными процессами (загрузка данных, обновление конфигураций, обработка слоёв).
import keplerGlMiddleware from 'kepler.gl/middleware';
const store = createStore(
rootReducer,
applyMiddleware(
keplerGlMiddleware
)
);
Middleware обеспечивает корректную обработку действий вроде добавления датасета или обновления визуальных слоёв без необходимости ручного управления side effects.
После настройки store можно подключить основной компонент:
import KeplerGl from 'kepler.gl';
function MapContainer() {
return (
<div style={{ height: '100vh', width: '100%' }}>
<KeplerGl
id="map"
mapboxApiAccessToken={process.env.MAPBOX_TOKEN}
width={window.innerWidth}
height={window.innerHeight}
/>
</div>
);
}
Идентификатор id критически важен: он используется для
изоляции нескольких экземпляров карт внутри одного приложения.
В реальных проектах Kepler.gl редко существует изолированно. Чаще всего требуется:
Типовой паттерн — подключение контейнерного компонента через
connect:
import { connect } from 'react-redux';
import KeplerGl from 'kepler.gl';
const Map = connect()(KeplerGl);
Это позволяет использовать стандартный Redux-flow без нарушения внутренней логики библиотеки.
Добавление данных осуществляется через actions:
import { addDataToMap } from 'kepler.gl/actions';
dispatch(
addDataToMap({
datasets: {
info: {
label: 'My dataset',
id: 'my_dataset'
},
data: geojsonData
},
options: {
centerMap: true,
readOnly: false
}
})
);
Данные могут приходить из REST API, WebSocket или локальных файлов. Важно учитывать формат: Kepler.gl поддерживает CSV, GeoJSON и специализированные структуры.
При подключении к backend архитектура обычно выглядит следующим образом:
addDataToMapПример загрузки:
async function loadMapData() {
const res = await fetch('/api/geo-data');
const data = await res.json();
dispatch(addDataToMap({
datasets: {
info: { id: 'server_data', label: 'Server Data' },
data
}
}));
}
Одна из ключевых возможностей интеграции — сериализация состояния карты.
import { exportFile } from 'kepler.gl/actions';
// экспорт конфигурации
dispatch(exportFile());
// восстановление
dispatch(
addDataToMap(savedState)
);
Конфигурация включает слои, фильтры, стили и положение камеры. Это позволяет реализовать:
Kepler.gl поддерживает несколько карт в одном приложении через разные
id:
<KeplerGl id="mapA" />
<KeplerGl id="mapB" />
Каждый экземпляр изолирует своё состояние в Redux:
state.keplerGl.mapA
state.keplerGl.mapB
Это особенно важно для дашбордов и аналитических систем.
Kepler.gl использует browser APIs, поэтому серверный рендеринг требует отключения SSR для карты:
import dynamic from 'next/dynamic';
const KeplerGl = dynamic(
() => import('kepler.gl'),
{ ssr: false }
);
Также важно избегать обращения к window до монтирования
компонента.
Kepler.gl включает собственные стили Mapbox и UI-компонентов. В интегрированном проекте часто возникают конфликты:
Рекомендуется изолировать контейнер:
.kepler-map-wrapper {
position: relative;
height: 100vh;
overflow: hidden;
}
При интеграции в сложные системы основная нагрузка возникает на:
Практические подходы:
Kepler.gl позволяет строить связанный интерфейс, где фильтры и контролы приложения управляют картой:
dispatch(
updateMap({
zoom: 10,
latitude: 50.45,
longitude: 30.52
})
);
Такой подход используется в аналитических панелях, где карта — лишь один из модулей.
При интеграции в UI системы важно учитывать, что Kepler.gl:
Часто требуется:
keplerGlКаждая из этих проблем приводит либо к пустой карте, либо к некорректной отрисовке слоёв.
В масштабируемых приложениях Kepler.gl чаще всего встраивается по одному из сценариев:
Во всех случаях ключевым остаётся принцип: состояние карты должно быть изолировано, но управляемо извне через Redux actions.