В Kepler.gl состояние визуализации строится вокруг единого объекта конфигурации, который описывает весь проект: слои, фильтры, состояние камеры, стили карты и параметры взаимодействия. Этот объект обычно называют config, и он является основой для сохранения и последующего восстановления визуализации.
Конфигурация делится на три ключевых блока:
Дополнительно иногда сохраняются служебные параметры, например UI-состояние или временные настройки, но они не обязательны для восстановления проекта.
Полная конфигурация Kepler.gl имеет следующий логический вид:
{
version: "v1",
config: {
visState: { ... },
mapState: { ... },
mapStyle: { ... }
}
}
Каждый блок отвечает за свою часть состояния и может изменяться независимо, однако при восстановлении проекта важно сохранять их согласованно.
Блок visState содержит всю аналитическую часть визуализации:
Пример структуры:
visState: {
datasets: {
dataId: {
data: [],
info: {
id: "dataId",
label: "Dataset"
}
}
},
layers: [
{
id: "layer1",
type: "point",
config: {
dataId: "dataId",
columns: {
lat: "lat",
lng: "lng"
},
isVisible: true
}
}
],
filters: [
{
id: "filter1",
dataId: "dataId",
name: "time",
type: "timeRange",
value: [1620000000, 1625000000]
}
]
}
dataIdБлок mapState отвечает за географическое положение и параметры камеры:
mapState: {
latitude: 55.751244,
longitude: 37.618423,
zoom: 10,
pitch: 45,
bearing: 0,
dragRotate: true
}
Этот блок критичен для сохранения «ракурса» визуализации, особенно в аналитических проектах, где важно восстановить точное положение обзора.
Блок mapStyle управляет визуальным стилем базовой карты:
mapStyle: {
styleType: "dark",
visibleLayerGroups: {
label: true,
road: true,
border: false,
building: true,
water: true
}
}
Сохранение состояния обычно выполняется через доступ к store приложения Kepler.gl.
Kepler.gl использует Redux как основное хранилище состояния:
const savedConfig = store.getState().keplerGl.map.config;
Однако более корректный способ — использовать селекторы:
const config = state.keplerGl.map.visState;
const mapState = state.keplerGl.map.mapState;
const mapStyle = state.keplerGl.map.mapStyle;
После этого данные собираются в единый объект:
const fullConfig = {
version: "v1",
config: {
visState: config,
mapState,
mapStyle
}
};
Для хранения или передачи конфигурации используется сериализация:
const json = JSON.stringify(fullConfig);
localStorage.setItem("keplerConfig", json);
Альтернативно конфигурация может быть отправлена на сервер:
fetch("/api/save-map", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(fullConfig)
});
Загрузка состояния выполняется через восстановление Redux-состояния или через dispatch действий Kepler.gl.
const saved = localStorage.getItem("keplerConfig");
const config = JSON.parse(saved);
Далее конфигурация применяется через action:
import { addDataToMap } from "@kepler.gl/actions";
store.dispatch(addDataToMap({
datasets: [],
config: config.config,
options: {
centerMap: true,
readOnly: false
}
}));
Основной механизм загрузки в Kepler.gl — это действие
addDataToMap.
dispatch(addDataToMap({
datasets: [
{
info: {
id: "dataId",
label: "Dataset"
},
data: rawData
}
],
config: savedConfig.config,
options: {
keepExistingConfig: false,
centerMap: true
}
}));
datasets заменяют или дополняют существующие
данныеconfig восстанавливает слои и фильтрыoptions.centerMap возвращает камеру в сохранённое
положениеВ ряде случаев требуется восстановить только часть состояния.
dispatch(updateMapState({
latitude: config.mapState.latitude,
longitude: config.mapState.longitude,
zoom: config.mapState.zoom
}));
dispatch(updateLayerConfig({
config: config.visState.layers
}));
Частичная загрузка полезна при динамическом обновлении данных без потери пользовательского контекста.
Поле version играет ключевую роль при долгосрочном
хранении проектов.
{
version: "v1",
config: { ... }
}
При изменении структуры Kepler.gl версия позволяет:
При обновлении версии библиотеки может потребоваться трансформация конфигурации:
function migrateConfig(oldConfig) {
if (!oldConfig.version) {
return {
version: "v1",
config: oldConfig
};
}
return oldConfig;
}
В сложных приложениях конфигурация может сохраняться поэтапно:
visStatemapStatemapStyleЭто позволяет уменьшить риск повреждения данных при частичных сбоях сохранения.
const saveVisState = JSON.stringify(state.visState);
const saveMapState = JSON.stringify(state.mapState);
const saveMapStyle = JSON.stringify(state.mapStyle);
Kepler.gl поддерживает несколько экземпляров карт в одном приложении. В этом случае конфигурация хранится отдельно для каждого instanceId:
state.keplerGl = {
map1: { ... },
map2: { ... }
};
Сохранение требует указания конкретного идентификатора:
const config = state.keplerGl.map1.config;
Иногда необходимо восстановить только визуальную часть без датасетов:
dispatch(addDataToMap({
datasets: [],
config: savedConfig.config,
options: {
readOnly: true
}
}));
Это используется для демонстрационных режимов или шаблонов карт.
При восстановлении конфигурации часто возникают несоответствия:
Базовая защита:
try {
const config = JSON.parse(saved);
dispatch(addDataToMap(config));
} catch (e) {
console.error("Invalid Kepler.gl config");
}
Дополнительно полезно валидировать структуру visState перед применением.
При работе с крупными датасетами:
Рекомендуется:
import LZString from "lz-string";
const compressed = LZString.compressToUTF16(JSON.stringify(config));
localStorage.setItem("keplerConfig", compressed);
Конфигурация Kepler.gl может использоваться:
Главное требование — сохранение структуры
visState/mapState/mapStyle, независимо от среды
исполнения.