В основе Kepler.gl лежит централизованное состояние, построенное
вокруг Redux. Любая программная навигация по карте сводится к изменению
mapState, который описывает текущую камеру: координаты
центра, масштаб, угол поворота и наклон.
Ключевые параметры состояния:
Изменение этих значений напрямую через редьюсер не является предпочтительным способом. Вместо этого используется набор action creators Kepler.gl, которые обеспечивают корректную синхронизацию состояния и внутренних подсистем визуализации.
Программная навигация в Kepler.gl означает управление картой без пользовательского взаимодействия. Это включает:
Основной инструмент — dispatch действий в Redux-хранилище Kepler.gl.
Для управления картой используется набор встроенных actions:
updateMapfitBoundstogglePerspectivesetMapModeaddDataToMapupdateVisDataНаиболее важные для навигации:
updateMap — прямое изменение viewportfitBounds — автоматическое масштабирование под
географические границыupdateMap позволяет задать новое состояние камеры
вручную.
import {updateMap} from 'kepler.gl/actions';
dispatch(updateMap({
latitude: 55.751244,
longitude: 37.618423,
zoom: 10,
bearing: 0,
pitch: 0,
transitionDuration: 1000
}));
Фактически это базовый инструмент для программной навигации. Он полезен в случаях:
Параметр transitionDuration включает анимацию
перемещения камеры.
Kepler.gl поддерживает анимированные переходы между состояниями камеры. Это достигается через интеграцию с deck.gl transition system.
При использовании updateMap можно задавать:
Пример:
dispatch(updateMap({
latitude: 48.8566,
longitude: 2.3522,
zoom: 12,
transitionDuration: 2000
}));
При таком подходе карта не «прыгает», а плавно перемещается к новой точке.
Одним из ключевых инструментов программной навигации является
fitBounds. Он вычисляет оптимальный viewport, чтобы все
точки попадали в видимую область.
import {fitBounds} from 'kepler.gl/actions';
dispatch(fitBounds([
[30.0, 50.0],
[40.0, 55.0]
]));
Где:
Алгоритм внутри Kepler.gl автоматически вычисляет:
Это используется при:
В Kepler.gl данные структурированы в виде слоёв
(layers). Часто требуется навигация не по координатам, а по
набору данных.
Пример сценария:
Типичный поток:
dispatch(addDataToMap({
datasets: data,
options: {
centerMap: true,
readOnly: false
}
}));
Параметр centerMap: true инициирует автоматическую
навигацию к загруженным данным.
Если требуется более точный контроль, bounding box можно вычислять самостоятельно:
const bounds = [
[minLng, minLat],
[maxLng, maxLat]
];
dispatch(fitBounds(bounds));
Это позволяет:
Kepler.gl часто интегрируется в приложения, где карта не является единственным источником управления.
Типичные источники событий:
Пример связки:
function onSelectRow(row) {
dispatch(updateMap({
latitude: row.lat,
longitude: row.lng,
zoom: 14,
transitionDuration: 800
}));
}
Таким образом создаётся синхронная система взаимодействия между UI и картой.
Все изменения навигации проходят через keplerGlReducer.
Он объединяет:
Программная навигация фактически изменяет mapState, но
может зависеть от visState, например при автофокусе.
Kepler.gl поддерживает несколько инстансов карт в одном приложении. Каждый имеет свой ключ состояния.
dispatch(updateMap({
mapIndex: 'map_1',
latitude: 51.5074,
longitude: -0.1278,
zoom: 11
}));
Это важно для сценариев:
В некоторых приложениях требуется ограничить перемещение камеры:
Это реализуется через mapState ограничения:
mapState: {
minZoom: 2,
maxZoom: 15,
dragRotate: false
}
Хотя это не прямое управление навигацией, оно формирует допустимое пространство перемещений.
При использовании React-обёртки KeplerGl навигация
осуществляется через Redux dispatch из внешних компонентов.
<KeplerGl
id="map"
mapboxApiAccessToken={token}
width={width}
height={height}
/>
Навигация выполняется вне компонента:
dispatch(updateMap({
latitude: 40.7128,
longitude: -74.0060,
zoom: 13
}));
Такой подход разделяет:
В Kepler.gl камера рассматривается как сериализуемый объект. Это позволяет:
Пример сохранения состояния:
const savedView = store.getState().keplerGl.mapState;
И последующего восстановления:
dispatch(updateMap(savedView));
При работе с временными слоями (time filter, animation) навигация может зависеть от текущего шага времени.
Например:
Это достигается комбинацией visState и
mapState.
Kepler.gl допускает построение сложных сценариев, например:
Пример последовательной навигации:
cities.forEach((city, i) => {
setTimeout(() => {
dispatch(updateMap({
latitude: city.lat,
longitude: city.lng,
zoom: city.zoom
}));
}, i * 2000);
});
Навигация часто связана с фильтрацией данных. При изменении фильтра можно автоматически пересчитывать viewport:
fitBoundsТак формируется динамическая карта, реагирующая на аналитические условия.
Каждый переход камеры формирует промежуточное состояние. Kepler.gl
хранит параметры перехода внутри mapState, включая:
Это позволяет корректно синхронизировать:
В сложных приложениях навигация может быть централизована через Redux middleware:
updateMap перед dispatchЭто используется для: