Функция setLayerConfig в Kepler.gl используется для
изменения конфигурации существующих слоёв визуализации без необходимости
пересоздания всего состояния карты. Это ключевой механизм тонкой
настройки отображения данных, позволяющий управлять стилями, типами
визуализации и параметрами рендеринга на уровне отдельных слоёв.
Kepler.gl строится на концепции декларативного состояния, где вся карта описывается через единый immutable state. Слои являются центральной частью этого состояния, а их конфигурация определяет, как именно данные будут представлены на карте.
setLayerConfig работает как часть action API
Redux-архитектуры Kepler.gl и позволяет обновлять config
конкретного слоя внутри visState.
Перед тем как рассматривать конфигурацию, важно понимать базовую структуру слоя:
layer = {
id: 'points-layer',
type: 'point',
config: {
dataId: 'dataset_1',
label: 'Points Layer',
color: [255, 0, 0],
columns: {
lat: 'latitude',
lng: 'longitude'
},
isVisible: true,
visConfig: {
radius: 10,
opacity: 0.8,
outline: true
}
}
}
Именно объект config является целью для модификации
через setLayerConfig.
В контексте Redux-действий Kepler.gl:
import { setLayerConfig } from '@kepler.gl/actions';
dispatch(setLayerConfig(layerId, newConfig));
Параметры:
layerId — строка, идентификатор слояnewConfig — объект конфигурации, частично или полностью
заменяющий текущий configsetLayerConfig выполняет поверхностное или частично
глубокое обновление состояния слоя:
Внутренне обновление проходит через reducer visState,
который обеспечивает иммутабельность состояния.
dispatch(setLayerConfig('points-layer', {
color: [0, 128, 255],
label: 'Updated Points Layer'
}));
В этом случае изменяются только цвет и название слоя, остальные параметры остаются без изменений.
Наиболее частый сценарий использования — изменение
visConfig:
dispatch(setLayerConfig('points-layer', {
visConfig: {
radius: 20,
opacity: 0.5
}
}));
Важно учитывать, что visConfig не заменяется полностью
на уровне вложенности, а мержится частично в зависимости от реализации
reducer’а слоя.
Разные типы слоёв имеют собственные наборы параметров
visConfig.
{
radius: number,
fixedRadius: boolean,
opacity: number,
outline: boolean
}
Пример изменения:
dispatch(setLayerConfig('point-layer', {
visConfig: {
radius: 5,
fixedRadius: true
}
}));
{
thickness: number,
opacity: number,
colorRange: object
}
dispatch(setLayerConfig('arc-layer', {
visConfig: {
thickness: 2,
opacity: 0.6
}
}));
{
coverage: number,
radius: number,
upperPercentile: number
}
dispatch(setLayerConfig('hex-layer', {
visConfig: {
radius: 40,
coverage: 0.8
}
}));
Особенность setLayerConfig заключается в том, что он не
гарантирует глубокую замену объектов. При работе с вложенными
структурами важно учитывать возможное поведение merge-операции:
Пример потенциально опасного обновления:
dispatch(setLayerConfig('layer-1', {
columns: {
lat: 'new_latitude'
}
}));
В этом случае поле lng может быть потеряно, если merge
не глубокий.
Корректный подход:
const currentConfig = getState().visState.layers.find(l => l.id === 'layer-1').config;
dispatch(setLayerConfig('layer-1', {
columns: {
...currentConfig.columns,
lat: 'new_latitude'
}
}));
Изменение конфигурации слоя может инициировать перерасчёт связанных сущностей:
filtersgpuFilterОсобенно это заметно при изменении:
dataIdcolumnsaggregationЧастые вызовы setLayerConfig могут влиять на
производительность:
Рекомендуемые паттерны:
const newConfig = {
color: [120, 200, 100],
label: 'Batch Updated Layer',
visConfig: {
opacity: 0.7,
radius: 12
}
};
dispatch(setLayerConfig('layer-1', newConfig));
setLayerConfig часто используется в интерактивных
интерфейсах:
setLayerConfig обычно используется вместе с:
addLayerremoveLayertoggleLayerupdateLayerBlendingsetFilterВзаимодействие этих действий формирует полный цикл управления визуализацией.
В TypeScript-окружении структура выглядит следующим образом:
type LayerConfig = {
label?: string;
color?: number[];
columns?: Record<string, string>;
isVisible?: boolean;
visConfig?: Record<string, any>;
};
Неправильная конфигурация может привести к:
dispatch(setLayerConfig('traffic-layer', {
label: 'Traffic Flow',
color: [255, 100, 50],
columns: {
lat: 'start_lat',
lng: 'start_lng'
},
visConfig: {
opacity: 0.4,
thickness: 3,
trailLength: 120
}
}));
Если layerId не существует:
Это делает API устойчивым к некорректным вызовам, но требует контроля на уровне приложения.
При использовании react-redux:
const dispatch = useDispatch();
useEffect(() => {
dispatch(setLayerConfig(layerId, config));
}, [config]);
Важно предотвращать бесконечные циклы обновлений при изменении
объекта config.
setLayerConfig применяется в системах:
Изменение конфигурации слоя становится механизмом управления визуальной семантикой данных без перезагрузки карты.