Объект Deck является центральным элементом библиотеки Deck.gl и выступает в роли управляющего контейнера для всех визуализаций. Именно он отвечает за создание и поддержку WebGL-контекста, управление слоями, обработку пользовательского взаимодействия, обновление состояния сцены и организацию процесса рендеринга.
В архитектуре библиотеки Deck представляет собой своеобразную «палубу», на которой размещаются различные слои визуализации. Независимо от того, используются ли точки, линии, полигоны, тепловые карты или трёхмерные объекты, все они существуют внутри единственного экземпляра Deck.
Упрощённая схема взаимодействия компонентов выглядит следующим образом:
Deck
├── View
├── ViewState
├── Controller
├── Layer
│ ├── ScatterplotLayer
│ ├── GeoJsonLayer
│ ├── ArcLayer
│ └── ...
└── Effects
Deck координирует работу всех перечисленных компонентов и обеспечивает их согласованное взаимодействие.
Работа с библиотекой практически всегда начинается с создания объекта Deck.
Простейший пример:
import {Deck} from '@deck.gl/core';
const deck = new Deck({
initialViewState: {
longitude: 37.6176,
latitude: 55.7558,
zoom: 10,
pitch: 0,
bearing: 0
},
controller: true,
layers: []
});
После создания экземпляра происходит:
С этого момента объект готов отображать любые слои Deck.gl.
Deck хранит список активных слоёв.
Пример:
const deck = new Deck({
layers: [
citiesLayer,
roadsLayer,
buildingsLayer
]
});
Каждый слой представляет отдельную сущность визуализации.
Deck выполняет следующие операции:
Сам разработчик обычно взаимодействует только с массивом
layers, а вся внутренняя логика синхронизации выполняется
автоматически.
Deck отвечает за настройку виртуальной камеры.
Камера определяется через объект состояния представления:
initialViewState: {
longitude: -74.006,
latitude: 40.7128,
zoom: 12,
pitch: 45,
bearing: 20
}
Основные параметры:
| Параметр | Назначение |
|---|---|
| longitude | Долгота центра карты |
| latitude | Широта центра карты |
| zoom | Масштаб |
| pitch | Наклон камеры |
| bearing | Поворот карты |
Deck преобразует эти значения в матрицы проекции и вида, необходимые для работы WebGL.
Отрисовка сцены производится централизованно через Deck.
В процессе рендеринга выполняются следующие этапы:
Изменение данных
↓
Обновление слоёв
↓
Подготовка атрибутов
↓
Обновление буферов GPU
↓
Вызов WebGL
↓
Отображение кадра
Разработчик не работает напрямую с WebGL-вызовами. Deck автоматически организует весь процесс.
Каждый слой проходит ряд этапов жизненного цикла:
Создание
↓
Инициализация
↓
Обновление
↓
Рендеринг
↓
Удаление
Deck контролирует переходы между этими этапами.
Например, если изменились данные слоя:
deck.setProps({
layers: [newLayer]
});
Deck самостоятельно определяет:
Конструктор принимает большой набор параметров.
Позволяет указать контейнер DOM.
new Deck({
parent: document.getElementById('map')
});
Внутри контейнера создаётся элемент Canvas, через который осуществляется визуализация.
Использование уже существующего элемента Canvas.
new Deck({
canvas: 'deck-canvas'
});
Либо:
new Deck({
canvas: document.getElementById('deck-canvas')
});
Такой подход полезен при интеграции с существующим приложением.
Список слоёв.
new Deck({
layers: [
scatterLayer,
geoJsonLayer
]
});
Это наиболее часто изменяемое свойство.
Начальное положение камеры.
new Deck({
initialViewState: {
longitude: 30,
latitude: 60,
zoom: 8
}
});
Используется при первом запуске визуализации.
Полностью управляемое состояние камеры.
new Deck({
viewState: currentViewState
});
В отличие от initialViewState, изменения должны
передаваться извне.
Подход широко используется в React-приложениях.
Включает взаимодействие пользователя с камерой.
new Deck({
controller: true
});
После активации становятся доступны:
Позволяет создавать несколько областей просмотра.
Пример:
new Deck({
views: [
new MapView(),
new FirstPersonView()
]
});
Один экземпляр Deck способен обслуживать сразу несколько камер.
После создания объекта его конфигурацию можно менять.
Для этого используется метод setProps.
deck.setProps({
layers: [newLayer]
});
Также возможно обновление камеры:
deck.setProps({
viewState: {
longitude: 10,
latitude: 50,
zoom: 5
}
});
Deck анализирует различия между старым и новым состоянием и выполняет только необходимые операции.
Такой механизм называется diffing и позволяет существенно уменьшить нагрузку на процессор и видеокарту.
Каждый слой существует исключительно внутри объекта Deck.
Пример:
const layer = new ScatterplotLayer({
id: 'points',
data: points
});
const deck = new Deck({
layers: [layer]
});
Слой не занимается:
Все эти обязанности находятся на стороне Deck.
Сам слой отвечает только за:
Подобное разделение делает архитектуру библиотеки модульной и расширяемой.
Deck содержит встроенную систему обработки пользовательских действий.
Поддерживаются события:
Пример:
new Deck({
onClick: info => {
console.log(info);
}
});
Объект info содержит информацию о выбранном объекте.
Например:
{
object: {...},
index: 15,
x: 340,
y: 220,
coordinate: [37.6, 55.7]
}
Deck автоматически определяет объект под курсором посредством механизма picking.
Одной из важнейших возможностей Deck является система выбора объектов.
При наведении курсора происходит:
Движение мыши
↓
Специальный проход рендеринга
↓
Определение объекта
↓
Формирование PickingInfo
↓
Вызов обработчика события
Разработчику не требуется реализовывать собственную систему пересечений лучей и геометрии.
Пример:
new ScatterplotLayer({
pickable: true,
onHover: info => {
console.log(info.object);
}
});
Все вычисления выполняются внутри Deck.
Deck часто работает совместно с картографическими библиотеками.
Наиболее распространённые варианты:
В подобных сценариях карта отображает базовую подложку, а Deck рисует поверх неё собственные визуализации.
Схема выглядит следующим образом:
Картографический движок
↓
Базовая карта
↓
Deck
↓
Слои визуализации
Это позволяет комбинировать мощные картографические возможности с высокопроизводительной GPU-визуализацией.
Deck поддерживает концепцию нескольких окон просмотра.
Пример:
new Deck({
views: [
new MapView({
id: 'map'
}),
new FirstPersonView({
id: 'first-person'
})
]
});
В результате одна сцена может одновременно отображаться:
Управление всеми представлениями остаётся централизованным через единый объект Deck.
Deck способен управлять графическими эффектами.
Пример подключения эффектов:
new Deck({
effects: [
lightingEffect
]
});
Через механизм эффектов реализуются:
Все эффекты координируются объектом Deck и интегрируются в общий графический конвейер.
После завершения работы экземпляр Deck необходимо уничтожать.
Для этого используется метод:
deck.finalize();
Во время выполнения метода освобождаются:
Особенно важно вызывать finalize() в одностраничных
приложениях, где компоненты могут создаваться и удаляться
многократно.
Внутри объекта Deck работает несколько специализированных менеджеров.
Отвечает за:
Управляет:
Контролирует:
Обрабатывает:
Совместная работа этих компонентов образует единый механизм визуализации, скрывающий сложность WebGL-инфраструктуры за простым интерфейсом объекта Deck.
Практически каждая операция в Deck.gl проходит через объект Deck:
По этой причине Deck рассматривается как центральная точка управления приложением и основной контейнер, объединяющий все остальные компоненты экосистемы Deck.gl в единую высокопроизводительную систему визуализации данных.