Система управления состоянием в Kepler.gl построена вокруг модели однонаправленного потока данных, где ключевую роль играют actions (действия). Они представляют собой описания намерений изменить состояние карты: добавить данные, изменить слой, обновить фильтры, перестроить представление или модифицировать параметры визуализации.
Kepler.gl использует подход, основанный на Redux-подобной
архитектуре, где каждое действие — это объект, передаваемый в store
через dispatch. Эти действия обрабатываются редьюсерами,
которые формируют новое состояние без мутаций исходных данных.
Каждое действие в Kepler.gl:
dispatchСтруктура типичного действия:
{
type: 'ACTION_NAME',
payload: { ...данные... }
}
В большинстве случаев разработчик не формирует такие объекты вручную,
а использует action creators из пакета
kepler.gl/actions.
Система действий в Kepler.gl логически разделена на несколько областей состояния:
visState — слои, фильтры, данныеmapState — положение карты, масштаб, центрuiState — интерфейсные параметрыmapStyle — стилизация картыКаждая группа управляется собственным набором действий.
Одно из ключевых действий — загрузка данных.
import {addDataToMap} from 'kepler.gl/actions';
Используется для первичной инициализации или добавления нового датасета:
dispatch(
addDataToMap({
datasets: {
info: {
label: 'Sample dataset',
id: 'sample_data'
},
data: csvData
},
option: {
centerMap: true,
readOnly: false
},
config: {
visState: {
layers: [
{
id: 'point-layer',
type: 'point'
}
]
}
}
})
);
Слои являются основой визуализации. Actions позволяют создавать, изменять и удалять их.
import {addLayer} from 'kepler.gl/actions';
dispatch(addLayer({
datasetId: 'sample_data',
config: {
type: 'hexagon',
id: 'heatmap-layer'
}
}));
import {layerUpdate} from 'kepler.gl/actions';
dispatch(layerUpdate({
layerId: 'heatmap-layer',
config: {
color: [255, 0, 0],
radius: 20
}
}));
import {toggleLayer} from 'kepler.gl/actions';
dispatch(toggleLayer('heatmap-layer'));
Фильтры позволяют ограничивать отображаемые данные.
import {addFilter} from 'kepler.gl/actions';
dispatch(addFilter('sample_data'));
import {updateFilter} from 'kepler.gl/actions';
dispatch(updateFilter('filter_id', {
value: [10, 50],
animationWindow: 'free'
}));
import {removeFilter} from 'kepler.gl/actions';
dispatch(removeFilter('filter_id'));
Фильтры тесно связаны с временными рядами и числовыми диапазонами, и могут автоматически адаптироваться под тип данных.
Состояние карты включает центр, масштаб, наклон и ориентацию.
import {updateMap} from 'kepler.gl/actions';
dispatch(updateMap({
latitude: 53.2,
longitude: 50.1,
zoom: 10,
bearing: 0,
pitch: 45
}));
При добавлении данных можно автоматически подстроить карту:
addDataToMap({
datasets: {...},
option: {
centerMap: true
}
})
import {removeDataset} from 'kepler.gl/actions';
dispatch(removeDataset('sample_data'));
Удаление датасета автоматически очищает:
Kepler.gl разделяет визуальное состояние на независимые блоки, но actions позволяют синхронизировать их.
import {updateVisData} from 'kepler.gl/actions';
dispatch(updateVisData({
datasets: [...],
config: {
visState: {
filters: [],
layers: []
}
}
}));
Используется при:
MapStyle actions отвечают за визуальное оформление базовой карты.
import {updateMapStyle} from 'kepler.gl/actions';
dispatch(updateMapStyle({
styleType: 'dark',
visibleLayerGroups: {
label: true,
road: false,
border: true
}
}));
import {setDefaultMapStyle} from 'kepler.gl/actions';
dispatch(setDefaultMapStyle('satellite'));
UI-состояние включает модальные окна, панели и настройки интерфейса.
import {toggleSidePanel} from 'kepler.gl/actions';
dispatch(toggleSidePanel('layer'));
import {openModal} from 'kepler.gl/actions';
dispatch(openModal('exportData'));
import {closeModal} from 'kepler.gl/actions';
dispatch(closeModal());
Actions в Kepler.gl можно комбинировать для создания сложных сценариев.
Пример загрузки данных с последующей настройкой слоя и фильтра:
dispatch(
addDataToMap({
datasets: {...},
option: {centerMap: true}
})
);
dispatch(
addFilter('dataset_id')
);
dispatch(
layerUpdate({
layerId: 'layer_1',
config: {
opacity: 0.8
}
})
);
Такая последовательность формирует детерминированное состояние карты.
Хотя actions выглядят синхронными, в реальных приложениях они часто используются вместе с middleware (например, Redux Thunk).
Пример загрузки данных из API:
const loadGeoData = () => async (dispatch) => {
const response = await fetch('/data/points.geojson');
const data = await response.json();
dispatch(
addDataToMap({
datasets: {
info: {id: 'geo', label: 'Geo Data'},
data
}
})
);
};
Actions позволяют сохранять и восстанавливать состояние карты как сериализуемый объект.
Состояние Kepler.gl может быть сохранено через mapState,
visState и mapStyle, а затем
восстановлено:
dispatch(
addDataToMap(savedConfig)
);
Это делает actions основным механизмом для:
Внутренний цикл выглядит следующим образом:
Эта модель обеспечивает предсказуемость и масштабируемость системы визуализации.
В TypeScript-окружениях actions имеют строгие типы, что позволяет:
Типы обычно импортируются из пакета Kepler.gl вместе с actions.
import {addDataToMap} from 'kepler.gl/actions';
Actions являются точкой расширения системы. Через них можно:
Именно через actions происходит вся управляемая модификация состояния, что делает их центральным механизмом всей архитектуры Kepler.gl.