В основе взаимодействия с картой и визуализациями в Deck.gl лежит
управление состоянием представления (viewState). Именно
через него контролируются перемещение, масштабирование и вращение сцены.
Ограничение перемещения представляет собой набор механизмов, позволяющих
фиксировать или сужать область навигации, предотвращая выход камеры за
допустимые границы, а также управлять степенью свободы пользователя при
исследовании данных.
Ключевой объект взаимодействия — viewState, который
описывает текущее положение и ориентацию камеры:
longitude, latitude — географические
координаты центра сценыzoom — уровень приближенияbearing — поворот карты вокруг вертикальной осиpitch — наклон камерыtransitionDuration — длительность анимации
переходаЛюбые ограничения перемещения в Deck.gl реализуются через контроль этих параметров, а не через отдельный слой абстракции.
Наиболее распространённый тип ограничений — фиксация географических границ.
Контроль осуществляется через проверку значений
longitude и latitude при обновлении
состояния:
[-180, 180][-85.0511, 85.0511] (из-за проекции
Web Mercator)При попытке выхода за пределы значения «зажимаются» (clamp), предотвращая сдвиг карты в недопустимые области.
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
const nextViewState = {
...viewState,
longitude: clamp(viewState.longitude, -180, 180),
latitude: clamp(viewState.latitude, -85.0511, 85.0511)
};
Такой подход применяется как при ручной обработке
onViewStateChange, так и в кастомных контроллерах.
Более гибкий механизм — ограничение рамками прямоугольной области карты. Он используется для предотвращения выхода пользователя за заданный регион.
Типичная реализация включает:
north)south)west)east)const bounds = {
north: 55.0,
south: 50.0,
west: 30.0,
east: 40.0
};
При изменении viewState координаты проверяются на
принадлежность прямоугольнику:
function clampToBounds(longitude, latitude, bounds) {
return {
longitude: Math.min(Math.max(longitude, bounds.west), bounds.east),
latitude: Math.min(Math.max(latitude, bounds.south), bounds.north)
};
}
Такой подход часто используется в геоаналитических приложениях, где важно ограничить исследование конкретным регионом.
Контроль масштаба — один из ключевых элементов ограничения перемещения. Он определяет, насколько близко или далеко пользователь может приблизить сцену.
Основные параметры:
minZoom — минимальный уровень приближенияmaxZoom — максимальный уровень приближенияconst viewStateConstraints = {
minZoom: 3,
maxZoom: 14
};
При обновлении состояния:
viewState.zoom = Math.min(
Math.max(viewState.zoom, viewStateConstraints.minZoom),
viewStateConstraints.maxZoom
);
Ограничение zoom часто используется для:
Deck.gl позволяет управлять свободой вращения сцены через
bearing и pitch.
bearing = 0 — север сверхуПример ограничения:
viewState.bearing = clamp(viewState.bearing, -45, 45);
Наклон камеры особенно важен для 3D-визуализаций. Чрезмерный наклон может привести к потере ориентации.
const pitchLimits = {
minPitch: 0,
maxPitch: 60
};
viewState.pitch = Math.min(
Math.max(viewState.pitch, pitchLimits.minPitch),
pitchLimits.maxPitch
);
Панорамирование (drag) напрямую связано с изменением
longitude и latitude. Ограничения здесь
делятся на два типа:
Жёсткая модель:
onViewStateChange: ({ viewState }) => {
const constrained = clampToBounds(
viewState.longitude,
viewState.latitude,
bounds
);
return {
viewState: {
...viewState,
...constrained
}
};
};
Мягкая модель часто дополняется анимацией возврата к допустимой области, создавая эффект «резиновой границы».
Deck.gl использует систему контроллеров (controller),
которые определяют допустимые жесты:
Ограничения задаются через конфигурацию:
const controller = {
dragPan: true,
dragRotate: false,
scrollZoom: {
speed: 0.01
},
doubleClickZoom: false
};
Полное отключение отдельных взаимодействий позволяет полностью зафиксировать сцену или создать специализированные режимы навигации.
В 3D-режиме ограничения перемещения становятся более сложными, так как добавляется ось Z и перспектива.
Типичные ограничения:
Пример ограничения высоты:
viewState.zoom = clamp(viewState.zoom, 10, 16);
В более сложных случаях применяется кастомная логика столкновений камеры с геометрией сцены.
Deck.gl опирается на Web Mercator, однако при использовании кастомных систем координат (CRS) ограничения перемещения задаются иначе.
Особенности:
Такие сценарии характерны для:
Ограничения перемещения часто дополняются анимацией, чтобы избежать резких скачков камеры.
Используются параметры:
transitionDurationtransitionInterpolatortransitionEasingПример:
viewState: {
longitude: constrained.longitude,
latitude: constrained.latitude,
zoom: constrained.zoom,
transitionDuration: 400
}
Анимация делает ограничения визуально плавными, скрывая момент коррекции координат.
При одновременном применении нескольких ограничений действует система приоритетов:
Конфликты разрешаются последовательным применением clamp-операций, что обеспечивает предсказуемое поведение камеры.
В реальных приложениях ограничения редко используются изолированно. Обычно применяется комбинация:
Такая конфигурация обеспечивает баланс между свободой навигации и контролем над визуализацией данных, особенно в аналитических и картографических системах на базе Deck.gl.