Экспорт интерактивной карты Kepler.gl в HTML опирается на идею сериализации текущего состояния визуализации и последующего встраивания этого состояния в автономную веб-страницу, способную воспроизвести карту без подключения к внешнему редактору. Вся логика сводится к трем ключевым слоям: данные, конфигурация визуализации и контейнер рендеринга.
Kepler.gl хранит всю конфигурацию карты в структуре состояния приложения. Она состоит из нескольких крупных блоков:
Именно этот объект становится ядром экспортируемого HTML:
const MAP_CONFIG = {
version: 'v1',
config: {
visState: { /* слои и фильтры */ },
mapState: { /* камера */ },
mapStyle: { /* стиль карты */ }
}
};
Сохранение этого объекта позволяет полностью восстановить визуализацию в любом окружении, где подключён Kepler.gl.
Перед формированием HTML важно привести состояние к компактному и переносимому виду. Обычно используется JSON-сериализация:
const serializedConfig = JSON.stringify(MAP_CONFIG);
Полученная строка может быть:
.json файлПри работе с большими наборами данных предпочтительно отделять данные от конфигурации, оставляя в HTML только ссылки или минимизированные структуры.
Kepler.gl не является standalone-библиотекой без зависимостей, поэтому HTML-экспорт подразумевает подключение React-окружения и сборщика или использование готового бандла.
Минимальная структура страницы включает контейнер:
<div id="app"></div>
и точку входа JavaScript, которая инициализирует приложение.
В стандартной React-интеграции используется компонент KeplerGl:
import React from 'react';
import ReactDOM from 'react-dom';
import KeplerGl from 'kepler.gl';
import { createStore, combineReducers, applyMiddleware } from 'redux';
import keplerGlReducer from 'kepler.gl/reducers';
const reducers = combineReducers({
keplerGl: keplerGlReducer
});
const store = createStore(reducers);
function App() {
return (
<KeplerGl
id="map"
width={window.innerWidth}
height={window.innerHeight}
mapboxApiAccessToken={MAPBOX_TOKEN}
/>
);
}
ReactDOM.render(<App />, document.getElementById('app'));
Такой подход формирует основу HTML-страницы, в которую затем подгружается сохранённая конфигурация.
После загрузки Kepler.gl необходимо восстановить карту из ранее экспортированного состояния:
import { addDataToMap } from 'kepler.gl/actions';
store.dispatch(
addDataToMap({
datasets: [],
config: MAP_CONFIG.config,
options: {
centerMap: true
}
})
);
Этот шаг обеспечивает восстановление слоёв, фильтров и визуальных параметров без дополнительной настройки.
HTML-экспорт обычно строится как шаблон, в который внедряются:
Пример упрощённого шаблона:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Kepler.gl Export</title>
<style>
body { margin: 0; overflow: hidden; }
#app { width: 100vw; height: 100vh; }
</style>
</head>
<body>
<div id="app"></div>
<script>
const CONFIG = /* вставка MAP_CONFIG */;
</script>
<script src="bundle.js"></script>
</body>
</html>
В реальных сценариях bundle.js собирается через Webpack
или Vite и содержит всю логику приложения.
Для полноценного HTML-экспорта часто используется сборка приложения:
// entry.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(<App />, document.getElementById('app'));
Далее конфигурация Kepler.gl встраивается внутрь
App:
function App() {
return (
<KeplerGl
id="map"
width={window.innerWidth}
height={window.innerHeight}
mapboxApiAccessToken={TOKEN}
/>
);
}
При сборке получается единый HTML с подключённым JavaScript-бандлом.
В некоторых конфигурациях возможно использование UMD-сборок библиотек. Тогда HTML может включать внешние зависимости:
<script src="https://unpkg.com/react/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
После чего Kepler.gl подключается через собранный пакет или кастомный бандл.
При встраивании данных необходимо учитывать размер:
fetch('/data/points.json')
.then(res => res.json())
.then(data => {
store.dispatch(
addDataToMap({
datasets: [{ data, info: { label: 'Points' } }],
config: MAP_CONFIG.config
})
);
});
HTML-экспорт должен учитывать зависимости визуализации:
Несовпадение версий может приводить к изменению отображения даже при одинаковом конфиге.
Полностью автономный HTML-экспорт обычно включает:
Такая структура обеспечивает переносимость визуализации между средами без потери интерактивности.