Kepler.gl основана на концепции единого состояния (single source of
truth), где вся конфигурация карты хранится в структурированном
состоянии Redux. Восстановление карты сводится к корректной сериализации
и последующей десериализации трёх ключевых частей:
visState, mapState, mapStyle. Эти
сегменты полностью определяют внешний вид, данные и поведение
визуализации.
Состояние Kepler.gl обычно состоит из следующих блоков:
Дополнительно могут присутствовать:
Полная структура состояния формирует сериализуемый объект, пригодный для хранения в базе данных, localStorage или передачи через URL.
Восстановление карты строится на обратной операции к сохранению:
Ключевой момент заключается в том, что Kepler.gl не хранит “проекцию карты”, а пересобирает её из состояния.
Состояние обычно сериализуется в JSON:
const savedState = {
version: 'v1',
keplerGl: {
map: {
visState: {...},
mapState: {...},
mapStyle: {...}
}
}
};
При сохранении важно учитывать:
Kepler.gl интегрируется с Redux через редьюсер
keplerGlReducer. Восстановление состояния выполняется через
инициализацию store:
import { createStore, combineReducers } from 'redux';
import keplerGlReducer from 'kepler.gl/reducers';
const store = createStore(
combineReducers({
keplerGl: keplerGlReducer
}),
persistedState
);
Где persistedState — ранее сохранённый JSON.
Ключевым моментом является совпадение структуры состояния с ожидаемой схемой reducer’а.
Помимо прямой инициализации store, используется диспатчинг действий.
import { addDataToMap } from 'kepler.gl/actions';
store.dispatch(
addDataToMap({
datasets: savedDatasets,
options: {
centerMap: true,
readOnly: false
},
config: savedConfig
})
);
Данный подход позволяет одновременно восстановить:
mapState отвечает за положение камеры:
mapState: {
latitude: 55.75,
longitude: 37.61,
zoom: 10,
bearing: 0,
pitch: 0
}
При восстановлении важно, чтобы эти параметры применялись после инициализации карты, иначе возможен конфликт с дефолтным состоянием.
visState является наиболее сложной частью
восстановления.
Она включает:
Пример структуры слоя:
layers: [
{
id: 'point-layer',
type: 'point',
config: {
dataId: 'dataset_1',
columns: {
lat: 'lat',
lng: 'lng'
}
}
}
]
При восстановлении важно соблюдать:
dataIdmapStyle отвечает за визуальную основу карты:
mapStyle: {
styleType: 'dark',
visibleLayerGroups: {
label: true,
road: true,
border: false
}
}
При восстановлении могут возникать проблемы при:
Kepler.gl не гарантирует обратную совместимость между версиями состояния. Поэтому вводится слой версионирования:
{
version: 'v2',
keplerGl: {...}
}
При восстановлении выполняется проверка версии:
Миграция обычно реализуется вручную через функции трансформации JSON.
Одним из ключевых сценариев является восстановление через URL-параметры.
Состояние кодируется в Base64:
const encoded = encodeURIComponent(
btoa(JSON.stringify(state))
);
При загрузке:
const state = JSON.parse(
atob(decodeURIComponent(encoded))
);
Особенности:
Простейший механизм хранения:
localStorage.setItem('kepler-state', JSON.stringify(state));
Загрузка:
const state = JSON.parse(
localStorage.getItem('kepler-state')
);
Особенности подхода:
Процесс восстановления часто называют гидратацией состояния.
Он включает этапы:
Особое внимание уделяется датасетам, так как они могут содержать большие объёмы данных и требуют асинхронной обработки.
Слои теряют связь с данными при изменении идентификаторов.
Изменение структуры таблиц приводит к ошибкам отображения слоёв.
Старые состояния могут не поддерживать новые типы слоёв или фильтров.
Mapbox styles могут стать недоступными при изменении ключей доступа.
Для устойчивого восстановления используется комбинация:
Приоритет обычно задаётся следующим образом:
При больших наборах данных восстановление требует асинхронного подхода:
store.dispatch(
addDataToMap({
datasets: await loadDatasets(),
options: {
centerMap: false
}
})
);
Асинхронность позволяет:
Перед применением состояния выполняются проверки:
visState,
mapState, mapStyleПри обнаружении ошибок применяется частичное восстановление, где корректные части состояния применяются, а повреждённые заменяются дефолтными значениями.
После загрузки состояния часто требуется синхронизация с текущей версией приложения:
Этот этап обеспечивает корректное отображение даже при изменении логики рендера между версиями Kepler.gl