Большинство примеров использования Deck.gl демонстрируют наложение визуализаций поверх картографических сервисов, таких как Mapbox, Google Maps или Carto. Однако архитектура библиотеки позволяет полностью отказаться от фоновой карты и использовать движок исключительно как высокопроизводительную систему визуализации данных.
Такой подход востребован в нескольких сценариях:
В этом режиме Deck.gl выступает не как надстройка над картой, а как самостоятельный WebGL-движок визуализации.
При работе без карты особенно важно понимать механизм координатных систем.
Обычно географические слои используют долготу и широту:
[longitude, latitude]
Например:
[37.6176, 55.7558]
Без базовой карты можно использовать произвольные координаты:
[x, y]
или
[x, y, z]
Например:
[150, 300]
или
[150, 300, 50]
Для подобных задач чаще всего применяется система координат:
COORDINATE_SYSTEM.CARTESIAN
Она отключает географические преобразования и заставляет Deck.gl воспринимать данные как обычное декартово пространство.
Пример:
import {COORDINATE_SYSTEM} from '@deck.gl/core';
const layer = new ScatterplotLayer({
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN
});
Без карты приложение становится значительно проще.
import {Deck} from '@deck.gl/core';
import {ScatterplotLayer} from '@deck.gl/layers';
const deck = new Deck({
initialViewState: {
target: [0, 0, 0],
zoom: 0
},
controller: true,
layers: [
new ScatterplotLayer({
data: [
{position: [100, 100]},
{position: [300, 200]},
{position: [500, 400]}
],
coordinateSystem: 0,
getPosition: d => d.position,
getRadius: 20,
getFillColor: [255, 0, 0]
})
]
});
Здесь отсутствует любой картографический компонент. На экране будут отображаться только точки.
Для негеографических проектов наиболее удобным представлением является ортографическая камера.
Она не имеет перспективных искажений и напоминает обычную двумерную систему координат.
Подключение:
import {OrthographicView} from '@deck.gl/core';
Создание:
const deck = new Deck({
views: new OrthographicView(),
initialViewState: {
target: [500, 500, 0],
zoom: 0
},
controller: true
});
Особенности ортографической проекции:
Часто данные существуют в диапазоне, не связанном с размерами экрана.
Например:
0–10000
или
-5000–5000
Deck.gl спокойно работает с такими значениями.
const data = [
{position: [1500, 4000]},
{position: [7000, 8500]}
];
Камера настраивается через параметр target:
initialViewState: {
target: [5000, 5000, 0],
zoom: -2
}
Таким образом можно просматривать огромные пространства данных без дополнительного масштабирования.
Распространённая задача — отображение точек поверх изображения.
Например:
Изображение может выступать фоном без использования картографического движка.
Для этого применяется BitmapLayer.
import {BitmapLayer} from '@deck.gl/layers';
Пример:
new BitmapLayer({
image: '/images/floorplan.png',
bounds: [
0,
0,
1000,
1000
]
});
Параметр bounds определяет координаты размещения
изображения в виртуальном пространстве.
После этого поверх изображения можно рисовать любые слои Deck.gl.
const pointsLayer = new ScatterplotLayer({
data: [
{
name: 'Sensor 1',
position: [250, 300]
},
{
name: 'Sensor 2',
position: [600, 700]
}
],
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
getPosition: d => d.position,
getRadius: 15,
getFillColor: [255, 0, 0]
});
Слои объединяются:
layers: [
bitmapLayer,
pointsLayer
]
В результате формируется интерактивный план помещения с объектами поверх него.
PathLayer отображает линии и маршруты.
В декартовой системе координат он превращается в универсальный инструмент рисования.
import {PathLayer} from '@deck.gl/layers';
Пример:
new PathLayer({
data: [
{
path: [
[100, 100],
[300, 200],
[500, 150]
]
}
],
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
getPath: d => d.path,
getColor: [0, 120, 255],
getWidth: 5
});
Применение:
Полигональные объекты также не требуют карты.
import {PolygonLayer} from '@deck.gl/layers';
Пример:
new PolygonLayer({
data: [
{
polygon: [
[100, 100],
[400, 100],
[400, 400],
[100, 400]
]
}
],
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
getPolygon: d => d.polygon,
getFillColor: [0, 200, 150, 120]
});
Подобным образом можно строить:
Deck.gl способен визуализировать полноценные трёхмерные сцены даже без карты.
Координаты получают вид:
[x, y, z]
Пример объекта:
{
position: [100, 200, 50]
}
Значение z отвечает за высоту.
import {ColumnLayer} from '@deck.gl/layers';
Пример:
new ColumnLayer({
data: [
{
position: [100, 100],
value: 50
},
{
position: [300, 200],
value: 100
}
],
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
getPosition: d => d.position,
getElevation: d => d.value,
radius: 20
});
Получается трёхмерная столбчатая диаграмма в произвольном пространстве.
Для полноценного просмотра трёхмерной сцены применяется
OrbitView.
import {OrbitView} from '@deck.gl/core';
Настройка:
views: new OrbitView()
Пример состояния камеры:
initialViewState: {
target: [0, 0, 0],
rotationOrbit: 45,
rotationX: 30,
zoom: 2
}
Возможности:
Работа без карты не ограничивает интерактивность.
Можно использовать стандартные события Deck.gl.
Пример:
new ScatterplotLayer({
data,
pickable: true,
onClick: info => {
console.log(info.object);
}
});
Событие возвращает:
{
object,
coordinate,
index,
layer
}
Поддерживаются:
onClick;onHover;onDragStart;onDrag;onDragEnd.Пример отображения информации при наведении:
new ScatterplotLayer({
data,
pickable: true,
onHover: info => {
if (info.object) {
console.log(info.object.name);
}
}
});
Используя объект info, можно создавать:
Отсутствие карты позволяет сосредоточить все ресурсы GPU на визуализации данных.
Deck.gl способен обрабатывать:
Практические рекомендации:
pickable: false
если выбор объектов не нужен.
Уменьшать число обновлений:
updateTriggers
Использовать бинарные данные вместо массивов объектов.
Применять агрегационные слои для сверхкрупных наборов данных.
Одновременно можно отображать несколько независимых видов данных.
Пример:
views: [
new OrthographicView({
id: 'main'
}),
new OrbitView({
id: 'preview'
})
]
Каждому представлению назначается собственное состояние камеры.
Подобная архитектура используется в:
Слои:
Слои:
Данные:
Слои:
Данные:
Слои:
Применение:
Слои:
Возможности:
При отказе от базовой карты становятся недоступны:
При этом сохраняются основные возможности Deck.gl:
В результате Deck.gl может использоваться как полноценный графический движок для отображения произвольных пространственных данных, где карта является лишь одной из возможных областей применения, а не обязательным компонентом архитектуры.