updateVisData — это действие уровня visState в
экосистеме Kepler.gl, предназначенное для обновления уже загруженного
набора данных без полной перезагрузки визуализации и без пересоздания
всех слоёв с нуля. Его ключевая задача — модифицировать данные карты
(datasets) так, чтобы существующие слои, фильтры и конфигурации
продолжили работать, но при этом получили обновлённый источник
значений.
Kepler.gl построен на архитектуре Redux, где состояние визуализации разделено на несколько ключевых срезов:
visState — данные, слои, фильтры, interaction
состоянияmapState — положение камеры, zoom, bearing, pitchuiState — интерфейсные настройкиupdateVisData относится к visState, потому
что он изменяет именно наборы данных, которые используются слоями и
фильтрами.
Главная особенность этого действия — оно не просто заменяет данные, а
пытается аккуратно обновить существующие датасеты по
dataId.
Использование updateVisData оправдано в сценариях,
где:
dataId)Типичный кейс — трекинг объектов (транспорт, пользователи, IoT-устройства), где координаты обновляются каждую секунду.
В Kepler.gl обновление данных происходит через action creator:
import {updateVisData} from 'kepler.gl/actions';
Основная форма данных, передаваемых в updateVisData,
выглядит так:
const dataset = {
data: [
{lat: 40.7, lng: -73.9, speed: 12},
{lat: 40.8, lng: -73.95, speed: 20}
],
info: {
id: 'my_dataset'
}
};
И затем:
dispatch(updateVisData(dataset));
Критически важный момент — совпадение dataId:
info.id совпадает с уже загруженным datasetЕсли dataId отличается — создаётся новый dataset, а не
обновляется существующий.
При вызове updateVisData происходит несколько
этапов:
Поиск существующего dataset в
visState.datasets
Сопоставление по info.id
Замена массива data
Пересчёт производных структур:
Обновление зависимых слоёв и фильтров
Важно, что Kepler.gl старается минимизировать пересоздание объектов, чтобы сохранить производительность при больших данных.
Часто updateVisData путают с addDataToMap,
но их поведение принципиально различается.
loadDataToMap — более высокий уровень абстракции:
updateVisData — низкоуровневое обновление данных без
вмешательства в конфигурацию карты.
В типичном React-приложении Kepler.gl используется через компонент
KeplerGl:
import KeplerGl from 'kepler.gl';
import {useDispatch} from 'react-redux';
import {updateVisData} from 'kepler.gl/actions';
Пример контейнера:
function MapContainer() {
const dispatch = useDispatch();
const updateData = (newData) => {
dispatch(updateVisData({
data: newData,
info: {
id: 'my_dataset'
}
}));
};
return (
<KeplerGl
id="map"
width={window.innerWidth}
height={window.innerHeight}
/>
);
}
Один из самых частых сценариев — потоковые данные.
setInterval(() => {
const updatedData = generateNewPoints();
dispatch(updateVisData({
data: updatedData,
info: {
id: 'realtime_points'
}
}));
}, 1000);
В этом случае Kepler.gl:
Слои в Kepler.gl привязаны к dataId. При вызове
updateVisData:
слой не пересоздаётся
обновляется только его data reference
сохраняются:
Однако есть важное ограничение: если структура данных изменилась (например, удалены или переименованы поля), слои могут потерять привязку к колонкам.
Чтобы обновление прошло корректно:
dataId должен быть постояннымНарушение этих условий приводит к:
При работе с массивами в сотни тысяч или миллионы строк
updateVisData может стать узким местом.
Причины:
Практика оптимизации:
Kepler.gl ожидает иммутабельное обновление состояния. Это означает:
Пример неправильного подхода:
dataset.data.push(newPoint); // недопустимо
dispatch(updateVisData(dataset));
Правильный подход:
const newDataset = {
...dataset,
data: [...dataset.data, newPoint]
};
dispatch(updateVisData(newDataset));
Если в карте используется несколько источников данных:
{
info: {id: 'vehicles'},
data: [...]
}
{
info: {id: 'stations'},
data: [...]
}
updateVisData может применяться выборочно:
dispatch(updateVisData({
data: updatedVehicles,
info: {id: 'vehicles'}
}));
При этом остальные datasets остаются неизменными.
Фильтры в Kepler.gl привязаны к колонкам dataset. При обновлении данных:
Особенно чувствительны:
Типичные проблемы при использовании updateVisData:
1. Dataset не обновляется
dataId2. Слои пустые после обновления
3. Фильтры сброшены
4. Производительность резко падает
Для устойчивой работы системы обновления данных:
dataId на уровне бизнес-логикиupdateVisDataВ продвинутых системах Kepler.gl часто используется как визуальный слой поверх потоковой аналитики:
В таких архитектурах updateVisData становится
центральным механизмом синхронизации состояния карты с внешним миром
данных.