Режим split map представляет собой механизм одновременного отображения нескольких картографических сцен в одном интерфейсе с синхронизацией состояния или независимым управлением. Он используется для сравнительного анализа пространственных данных, оценки изменений во времени, сопоставления слоёв или визуализации альтернативных сценариев на одной географической области.
В основе режима лежит идея разделения визуального пространства на несколько независимых вьюпортов, каждый из которых может содержать собственный набор слоёв, фильтров и настроек камеры. При этом Kepler.gl поддерживает как полную синхронизацию взаимодействий (панорамирование, зум, вращение), так и частичную или полную независимость карт.
Внутренне Kepler.gl оперирует единым состоянием приложения, однако при активации split map состояние логически разделяется на несколько view states:
viewState AviewState BviewState N)Каждый viewState включает:
latitude,
longitude)zoom)bearing)pitch)Параллельно каждому viewState могут быть привязаны:
layers)filters)animationConfig)Активация режима осуществляется через конфигурацию интерфейса:
const mapConfig = {
mapState: {
latitude: 55.751244,
longitude: 37.618423,
zoom: 10
},
splitMaps: {
enabled: true,
views: [
{
id: 'left-map',
mapState: {
latitude: 55.751244,
longitude: 37.618423,
zoom: 10
}
},
{
id: 'right-map',
mapState: {
latitude: 55.751244,
longitude: 37.618423,
zoom: 12
}
}
]
}
};
Ключевой параметр splitMaps.enabled включает механизм
разбиения интерфейса. Массив views определяет количество
отображаемых карт.
Одним из центральных механизмов split map является синхронизация состояний. Она может быть реализована в нескольких режимах:
Все изменения в одной карте отражаются на другой:
Такой режим полезен при сравнении различных слоёв на одной и той же области.
Синхронизируются только отдельные параметры:
Каждая карта управляется отдельно, используется для анализа разных регионов или временных срезов.
function syncViewStates(sourceViewState, targetViewState) {
return {
...targetViewState,
latitude: sourceViewState.latitude,
longitude: sourceViewState.longitude,
zoom: sourceViewState.zoom,
bearing: sourceViewState.bearing,
pitch: sourceViewState.pitch
};
}
В реальной архитектуре Kepler.gl это реализуется через Redux-стор, где обновление одного viewState может триггерить обновление другого через middleware.
Одним из наиболее частых сценариев является сравнение двух наборов данных:
Каждая карта содержит собственный набор слоёв:
const layersLeft = [
{
id: 'population-2020',
type: 'hexagon',
data: data2020,
config: {
colorRange: [255, 200, 0]
}
}
];
const layersRight = [
{
id: 'population-2025',
type: 'hexagon',
data: data2025,
config: {
colorRange: [0, 150, 255]
}
}
];
Разделение слоёв позволяет визуально оценивать динамику изменений без необходимости переключения датасетов.
Фильтры в Kepler.gl могут быть:
Пример локальных фильтров:
const filters = {
left: [
{
id: 'year-filter',
dataId: 'dataset-left',
field: 'year',
value: [2020, 2020]
}
],
right: [
{
id: 'year-filter',
dataId: 'dataset-right',
field: 'year',
value: [2025, 2025]
}
]
};
Такой подход позволяет выполнять временное сечение данных независимо в каждой карте.
Каждый split view имеет собственную камеру WebGL сцены. Это означает, что:
Важно учитывать производительность при использовании:
Kepler.gl позволяет перехватывать события взаимодействия пользователя:
onMapMoveonZoomonClickonHoverПример обработки синхронизации движения:
function handleMapMove(sourceId, viewState) {
if (sourceId === 'left-map') {
updateViewState('right-map', {
latitude: viewState.latitude,
longitude: viewState.longitude,
zoom: viewState.zoom
});
}
}
Такой механизм часто реализуется через единый event bus или Redux action middleware.
При использовании split map важно учитывать дублирование рендеринга:
Оптимизация включает:
Split map часто используется для аналитических задач:
Пример сценария:
Внутренняя архитектура Kepler.gl основана на Redux, где split map представляется как расширение state tree:
const initialState = {
mapState: {
splitMaps: {
left: {},
right: {}
}
}
};
Reducer обновляет конкретный view:
function mapStateReducer(state, action) {
switch (action.type) {
case 'UPDATE_SPLIT_VIEW':
return {
...state,
splitMaps: {
...state.splitMaps,
[action.viewId]: {
...state.splitMaps[action.viewId],
...action.payload
}
}
};
default:
return state;
}
}
Несмотря на гибкость, режим имеет ряд технических ограничений:
Особенно критично при работе с:
Если используется временная анимация, каждая карта может:
Пример независимых таймлайнов:
splitMaps: {
left: {
animationConfig: {
currentTime: 1609459200
}
},
right: {
animationConfig: {
currentTime: 1672444800
}
}
}
Split map часто становится основой BI-интерфейсов:
Особенность подхода заключается в том, что визуальное сравнение заменяет необходимость сложных таблиц и отчётов.