PathLayer в Deck.gl предназначен для визуализации линейных геометрий, представленных в виде последовательностей координат. Слой используется для отрисовки маршрутов, траекторий движения, сетей дорог, логистических линий, временных треков и любых полилиний, требующих масштабируемой и производительной отрисовки в WebGL.
Ключевая особенность слоя заключается в поддержке переменной ширины линии, управления её поведением в экранных и географических единицах, а также оптимизации рендеринга больших наборов путей.
PathLayer оперирует набором объектов, каждый из которых содержит путь как массив координат:
const data = [
{
path: [
[37.78, -122.41],
[37.79, -122.42],
[37.80, -122.43]
],
color: [255, 0, 0],
width: 4
}
];
Альтернативный формат предполагает вычисление пути через accessor:
new PathLayer({
id: 'path-layer',
data,
getPath: d => d.path,
getColor: d => d.color,
getWidth: d => d.width
});
Такой подход позволяет отделять структуру данных от визуальных правил, обеспечивая гибкость при работе с разнородными источниками.
Источник данных. Может быть массивом объектов или результатом трансформации внешних API.
Функция доступа к координатам пути.
getPath: d => d.coordinates
Каждый путь представляет собой массив точек [lng, lat]
или [lng, lat, z].
Определяет цвет линии.
getColor: d => [0, 128, 255, 200]
Поддерживается RGBA-формат, где альфа-канал влияет на прозрачность.
Устанавливает ширину линии. Значение интерпретируется в зависимости
от widthUnits.
getWidth: d => d.thickness
Определяет систему измерения ширины:
pixels — фиксированная ширина в пикселяхmeters — географическая ширина в метрахcommon — абстрактная единица, масштабируемая
сценойИспользование meters критично для картографических
приложений, где требуется сохранение реального масштаба при зуме.
Ограничивают визуальную толщину линии при масштабировании.
widthMinPixels: 1,
widthMaxPixels: 10
Эти параметры предотвращают исчезновение линий при отдалении камеры и чрезмерное утолщение при приближении.
Управляют стилем соединений сегментов:
rounded: сглаживание всей линииjointRounded: скругление только в узлахИспользование скруглений увеличивает визуальную гладкость, но может снижать производительность при большом количестве сегментов.
Определяет форму окончания линии:
true — округлые окончанияfalse — прямые срезыКонтролирует поведение острых углов при соединении сегментов. Используется при неокруглённых соединениях, предотвращая артефакты на резких поворотах.
PathLayer преобразует входные координаты в набор вершин, которые затем передаются в шейдеры WebGL. Каждый сегмент линии разбивается на треугольники, формирующие полосу фиксированной или переменной ширины.
Основная задача GPU-части — вычислить нормали к сегментам и построить геометрию с учётом:
import {Deck} from '@deck.gl/core';
import {PathLayer} from '@deck.gl/layers';
const layer = new PathLayer({
id: 'route-path',
data: [
{
path: [
[37.7749, -122.4194],
[37.7849, -122.4094],
[37.7949, -122.3994]
],
color: [255, 0, 0],
width: 5
}
],
getPath: d => d.path,
getColor: d => d.color,
getWidth: d => d.width,
widthUnits: 'pixels',
rounded: true
});
const deck = new Deck({
initialViewState: {
longitude: -122.41,
latitude: 37.78,
zoom: 12
},
controller: true,
layers: [layer]
});
PathLayer предполагает использование координат в формате
[longitude, latitude]. При добавлении третьей компоненты
[lng, lat, elevation] слой способен учитывать высоту, что
позволяет строить трёхмерные траектории.
При работе в meters важно учитывать проекцию карты и
возможные искажения на высоких широтах.
При большом количестве путей ключевым фактором становится минимизация затрат на передачу данных в GPU.
Deck.gl поддерживает бинарные атрибуты, что снижает накладные расходы на сериализацию:
Сложные линии с высокой плотностью точек могут быть упрощены до рендеринга:
Использование widthMinPixels и
widthMaxPixels предотвращает избыточное перерасходование
GPU при экстремальных зумах, снижая необходимость перерасчёта
геометрии.
PathLayer поддерживает события взаимодействия через picking API Deck.gl.
onHover: info => {
if (info.object) {
console.log(info.object);
}
}
Каждый сегмент пути может быть интерактивно выделен, что используется в системах мониторинга транспорта и аналитике перемещений.
Layer обновляется при изменении props. При потоковых данных важно минимизировать полную пересборку:
PathLayer часто используется для отображения:
С разными стилями для статуса:
getColor: d => d.delayed ? [255, 0, 0] : [0, 200, 0]
При добавлении временной оси данные могут содержать метки времени, а визуализация обновляться по фильтру:
getPath: d => d.track.filter(p => p.time > threshold)
Использование высоты позволяет строить пространственные пути:
path: [
[0, 0, 0],
[10, 10, 1000],
[20, 5, 2000]
]
Такие данные применяются в авиации, дронах и научной визуализации.
При изменении zoom уровня происходит перерасчёт экранной толщины
линий. В meters-режиме слой стремится сохранить физическую
ширину объекта, тогда как в pixels — визуальную
консистентность.
Комбинация этих режимов используется для гибридных картографических систем, где важны как визуальные, так и географические свойства объектов.