deck.gl включает набор высокоуровневых слоёв для построения 2D/3D визуализаций поверх карт и произвольных WebGL-сцен. ColumnLayer относится к категории 3D-экструзионных слоёв, предназначенных для отображения дискретных значений в виде вертикальных колонн, где высота каждой колонки соответствует числовому атрибуту данных.
ColumnLayer применяется в задачах пространственной аналитики: плотность объектов, агрегация по географическим ячейкам, визуализация статистики по регионам, представление тепловых распределений в объёмной форме. Основная идея слоя заключается в преобразовании точечного набора координат в набор вертикальных цилиндрических или призматических объектов.
Каждый элемент данных в ColumnLayer интерпретируется как независимая колонна, расположенная в пространстве по координатам:
Типичная структура данных:
const data = [
{ position: [71.4304, 51.1281], value: 120 },
{ position: [72.2000, 50.9000], value: 80 },
{ position: [70.9000, 51.3000], value: 200 }
];
Каждый объект содержит минимум координаты, а остальные поля используются для вычисления визуальных свойств.
ColumnLayer конфигурируется через набор свойств, определяющих геометрию и визуализацию.
Функция извлечения координат:
getPosition: d => d.position
Возвращает массив [lng, lat]. Это обязательный
параметр.
Определяет высоту колонны:
getElevation: d => d.value
Высота интерпретируется в мировых единицах или метрах (в зависимости от контекста карты и scale).
Радиус основания колонны:
radius: 500
Значение задаётся в метрах при использовании географической проекции. Малые радиусы дают точечное представление, большие — агрегированное.
Цвет заливки вычисляется на основе данных:
getFillColor: d => [255, 140, 0, 200]
RGBA-массив позволяет управлять прозрачностью и визуальной иерархией.
Обводка колонн:
getLineColor: d => [0, 0, 0, 255]
Используется для отделения колонн при высокой плотности объектов.
Глобальный множитель высоты:
elevationScale: 10
Позволяет усиливать или уменьшать визуальное восприятие перепадов данных без изменения исходных значений.
ColumnLayer строит цилиндрические или призматические меши на GPU. Каждая колонна фактически представляет собой:
При рендеринге используется instanced rendering: одна геометрия переиспользуется для всех объектов, а различия передаются через attribute buffers.
Это снижает нагрузку на GPU и позволяет обрабатывать десятки тысяч объектов без деградации производительности.
Высота колонн часто требует нормализации для корректного отображения:
const max = Math.max(...data.map(d => d.value));
new ColumnLayer({
data,
getPosition: d => d.position,
getElevation: d => (d.value / max) * 1000,
radius: 300,
elevationScale: 1
});
Использование нормализации позволяет избежать доминирования выбросов и улучшает визуальное сравнение.
ColumnLayer часто используется вместе с градиентными шкалами:
getFillColor: d => {
if (d.value > 150) return [255, 0, 0, 200];
if (d.value > 80) return [255, 165, 0, 200];
return [0, 200, 0, 200];
}
Цвет может отражать:
ColumnLayer часто применяется после предварительной агрегации данных. Например, при работе с большим количеством точек используется биннинг:
const aggregated = bins.map(bin => ({
position: bin.center,
value: bin.count
}));
Такой подход снижает количество объектов и улучшает читаемость визуализации.
ColumnLayer оптимизирован для WebGL, но требует соблюдения ряда принципов:
Функции getPosition, getElevation и getFillColor должны быть максимально лёгкими.
Изменение данных вызывает полную переразметку слоя.
Практический предел зависит от GPU, но оптимально:
ColumnLayer поддерживает picking — определение объекта под курсором.
onHover: info => {
if (info.object) {
console.log(info.object.value);
}
}
Объект info содержит:
Это позволяет строить интерактивные дашборды и всплывающие панели.
import { DeckGL } from '@deck.gl/react';
import { ColumnLayer } from '@deck.gl/layers';
const layer = new ColumnLayer({
id: 'column-layer',
data: [
{ position: [71.43, 51.12], value: 100 },
{ position: [71.50, 51.15], value: 180 },
{ position: [71.60, 51.10], value: 60 }
],
diskResolution: 12,
radius: 400,
extruded: true,
elevationScale: 10,
getPosition: d => d.position,
getFillColor: d => [30, 144, 255, 180],
getElevation: d => d.value
});
const deck = new DeckGL({
initialViewState: {
longitude: 71.43,
latitude: 51.12,
zoom: 11,
pitch: 45
},
controller: true,
layers: [layer]
});
ColumnLayer позволяет управлять детализацией окружности:
diskResolution: 4 // квадратная колонна
diskResolution: 20 // почти круглая форма
Низкие значения используются для ускорения рендеринга, высокие — для визуальной точности.
ColumnLayer часто комбинируется с базовыми слоями:
В 3D-сценах колонны создают вертикальную структуру данных, позволяя анализировать распределение по поверхности.
При плотном размещении колонн может возникать z-fighting. Решения:
ColumnLayer работает в декларативной модели: изменение props автоматически пересоздаёт GPU-буферы.
layer.setProps({
data: newData,
getElevation: d => d.value * 2
});
Это позволяет интегрировать слой в React/Redux архитектуры без ручного управления WebGL.
ColumnLayer применяется в системах:
Вертикальная модель визуализации обеспечивает интуитивное восприятие количественных различий на пространстве.