Архитектура отображения карты в Kepler.gl основана на концепции контролируемого состояния viewport, которое определяет текущее положение камеры, масштаб, наклон и поворот сцены. Вся геопространственная визуализация, включая слои, анимации и взаимодействия, опирается на синхронизацию состояния карты с Redux-хранилищем и механизмами deck.gl.
Viewport представляет собой объект состояния, описывающий камеру в трёхмерном пространстве карты.
Основные поля:
Каждое изменение этих параметров приводит к перерасчёту матрицы проекции и перерисовке всех слоёв через WebGL.
Viewport является частью более широкого состояния карты, которое включает:
Viewport хранится внутри mapState и обновляется через
действия Redux.
Пример структуры:
{
mapState: {
latitude: 55.751244,
longitude: 37.618423,
zoom: 10,
bearing: 0,
pitch: 0,
dragRotate: true
}
}
Kepler.gl может работать в двух режимах управления камерой:
В этом режиме внешний код полностью управляет состоянием viewport. Любое движение карты вызывает событие обновления состояния, которое должно быть синхронизировано обратно.
Ключевой механизм — обработчик onViewStateChange.
<KeplerGl
mapboxApiAccessToken={token}
id="map"
onViewStateCha nge={({ viewState }) => {
dispatch(updateMap(viewState));
}}
/>
Характеристики:
В этом режиме Kepler.gl самостоятельно управляет viewport внутри себя через Redux store.
<KeplerGl
mapboxApiAccessToken={token}
id="map"
/>
Особенности:
Kepler.gl использует набор Redux-экшенов для изменения камеры.
Базовое действие для изменения viewport:
dispatch(
updateMap({
latitude: 40.7128,
longitude: -74.0060,
zoom: 12
})
);
Особенности:
Механизм автоматического масштабирования карты под заданный bounding box.
dispatch(
fitBounds({
bounds: [
[-74.2, 40.7],
[-73.9, 40.8]
],
padding: 40
})
);
Поведение:
Kepler.gl построен поверх deck.gl, который использует
ViewState как основной источник данных для камеры.
Viewport в Kepler.gl транслируется в параметры:
initialViewStateviewStateonViewStateChangedeck.gl ожидает обновления состояния при каждом изменении пользовательского взаимодействия (панорамирование, zoom, rotation).
Для создания анимации перемещения камеры используется интерполяция состояния viewport.
Основные механизмы:
Пример логики перехода:
dispatch(
updateMap({
latitude: 48.8566,
longitude: 2.3522,
zoom: 11,
transitionDuration: 1000
})
);
Параметр transitionDuration определяет длительность
анимации.
Viewport обновляется в ответ на пользовательские действия:
Каждое действие генерирует новый viewState, который
проходит через обработчик:
onViewStateChange({ viewState }) => {
dispatch(updateMap(viewState));
}
Таким образом формируется непрерывный цикл:
ввод пользователя → новый viewport → Redux → рендер → отображение
Для контроля области отображения применяются ограничения:
Пример конфигурации:
{
mapState: {
minZoom: 2,
maxZoom: 15,
dragRotate: false
}
}
Эти параметры предотвращают выход камеры за допустимые пределы.
Viewport часто синхронизируется с внешними источниками:
Пример синхронизации с URL:
const viewState = {
latitude,
longitude,
zoom
};
history.replace(`#map=${JSON.stringify(viewState)}`);
При восстановлении состояния карта возвращается к сохранённой позиции.
Kepler.gl поддерживает несколько экземпляров карт в одном приложении.
Каждый экземпляр имеет собственный id, который изолирует
состояние:
<KeplerGl id="mapA" />
<KeplerGl id="mapB" />
Каждый viewport хранится отдельно:
state = {
keplerGl: {
mapA: { mapState: {...} },
mapB: { mapState: {...} }
}
}
Это позволяет:
Частые изменения камеры могут вызывать нагрузку на GPU и Redux.
Оптимизационные подходы:
onViewStateChangeОсобенно критично при:
При включённом pitch и bearing viewport становится полноценной 3D-камерой.
Особенности:
3D-режим усиливает зависимость от GPU и требует более аккуратной работы с частотой обновлений.
Камера может управляться без пользовательского ввода:
dispatch(
updateMap({
latitude: 35.6895,
longitude: 139.6917,
zoom: 12,
bearing: 45,
pitch: 30
})
);
Это используется для:
Viewport влияет на:
При увеличении zoom происходит:
UI Kepler.gl может изменять viewport через:
Каждое UI-действие вызывает Redux-экшен, который модифицирует mapState и инициирует перерисовку сцены.
Viewport в Kepler.gl формирует связующее звено между:
Каждое изменение камеры — это атомарное обновление состояния, которое приводит к полной синхронизации визуального слоя и геометрической сцены без промежуточных состояний.