ContourLayer представляет собой слой визуализации, предназначенный для построения изолиний (контурных линий) по набору точечных данных. Основная задача слоя — преобразование дискретного набора измерений в непрерывную скалярную поверхность и последующее извлечение линий равных значений (isolevels). Такой подход широко используется в геоинформационных системах, климатических моделях, анализе плотности событий и визуализации пространственных распределений.
Контурная визуализация опирается на представление данных как функции двух переменных:
[ z = f(x, y)]
где каждая точка пространства ((x, y)) имеет ассоциированное значение (z), например плотность, интенсивность или агрегированное значение.
z = f(x, y)
Изолиния определяется как множество точек, удовлетворяющих условию:
[ f(x, y) = c]
f(x, y) = c
где (c) — фиксированное значение уровня (contour threshold). Слой ContourLayer строит несколько таких уровней для заданного диапазона.
ContourLayer выполняет несколько этапов преобразования данных:
Входные точки проецируются на регулярную сетку. Каждая ячейка сетки накапливает значения:
Итогом становится двумерное поле значений.
После агрегации формируется матрица:
[ M_{i,j} = w_k]
M_{i,j} = w_k
где каждая ячейка содержит агрегированное значение всех точек, попавших в её границы.
На этапе генерации геометрии используется алгоритм типа marching squares. Он анализирует каждую ячейку сетки и определяет, пересекает ли контур её границы.
Каждая ячейка рассматривается как квадрат с четырьмя значениями углов:
По этим значениям определяется конфигурация пересечения уровня (c).
Точки пересечения вычисляются линейной интерполяцией:
[ t = ]
t =
Это позволяет получать гладкие линии даже при дискретной сетке.
Источник данных. Обычно массив объектов с координатами:
Функция извлечения координат:
getPosition: d => [d.lng, d.lat]
Определяет вклад каждой точки в скалярное поле:
getWeight: d => d.value
Вес влияет на итоговую плотность в ячейке сетки.
Ключевая конфигурация уровней:
contours: [
{threshold: 10, color: [255, 0, 0]},
{threshold: 20, color: [0, 255, 0]},
{threshold: 30, color: [0, 0, 255]}
]
Каждый объект задаёт:
Размер сеточной ячейки в пикселях или метрах (в зависимости от режима проекции).
Меньшие значения:
Большие значения:
Определяет метод накопления значений:
ContourLayer использует GPU-ускорение через WebGL. Основные этапы:
Каждая точка кодируется в vertex buffer:
Фрагментный шейдер распределяет вклад точек по сетке. Это позволяет выполнять вычисления параллельно для каждой ячейки.
После построения сетки выполняется извлечение контуров и генерация геометрии линий.
import {Deck} from '@deck.gl/core';
import {ContourLayer} from '@deck.gl/aggregation-layers';
const layer = new ContourLayer({
id: 'contour-layer',
data: points,
getPosition: d => [d.lng, d.lat],
getWeight: d => d.value,
cellSize: 500,
contours: [
{threshold: 5, color: [255, 200, 0]},
{threshold: 10, color: [255, 100, 0]},
{threshold: 20, color: [255, 0, 0]}
]
});
const deck = new Deck({
initialViewState: {
longitude: 37.6173,
latitude: 55.7558,
zoom: 10
},
controller: true,
layers: [layer]
});
ContourLayer поддерживает два основных режима:
Контуры отображаются как полилинии без заливки. Используется для аналитических задач, где важны границы уровней.
Каждая зона между уровнями заполняется цветом. Такой режим используется для визуализации плотности или интенсивности.
Качество контуров зависит от:
При недостаточной детализации появляются ступенчатые артефакты, вызванные дискретной природой grid-структуры.
Основные факторы влияния:
Оптимизация достигается за счёт:
ContourLayer работает в экранной или географической проекции:
При использовании географических координат учитывается искажение расстояний, особенно на высоких широтах.
Вес каждой точки напрямую влияет на итоговую поверхность:
Это позволяет моделировать плотность населения, интенсивность событий или распределение ресурсов.
ContourLayer часто используется совместно с:
Комбинация слоёв позволяет строить многослойные аналитические карты, где контуры служат обобщённым представлением данных.