PathStyleExtension используется для расширения возможностей базовых
слоёв, работающих с линейной геометрией, прежде всего
PathLayer, а также совместимых слоёв, чтобы обеспечить
более гибкое и детализированное управление стилем линий на уровне
отдельных объектов.
Ключевая проблема стандартного рендеринга путей в WebGL заключается в том, что большинство параметров стиля задаются на уровне слоя целиком. Это ограничивает визуальную выразительность при работе с разнородными геоданными, где каждый сегмент маршрута может требовать собственного набора визуальных характеристик: толщины, типа линии, формы соединений и окончания.
PathStyleExtension решает эту задачу, вводя инстанс-атрибуты стилизации, которые позволяют управлять внешним видом каждой линии независимо.
PathStyleExtension работает как слой абстракции над атрибутной системой deck.gl. Вместо фиксированных uniform-параметров, стилизация переносится в instanced attributes, вычисляемые на уровне каждого объекта данных.
Основные принципы:
PathLayer без
изменения исходного API данныхПри подключении расширения слой автоматически добавляет дополнительные атрибуты и шейдерные ветки, отвечающие за обработку параметров стиля.
PathStyleExtension передаётся в массив extensions
слоя:
import {PathLayer} fr om '@deck.gl/layers';
import {PathStyleExtension} from '@deck.gl/extensions';
const layer = new PathLayer({
id: 'paths',
data: paths,
getPath: d => d.path,
getColor: d => d.color,
getWidth: d => d.width,
extensions: [new PathStyleExtension({offset: true})]
});
Флаг offset включает поддержку смещения линии
относительно её геометрического центра, что позволяет реализовывать
сложные визуальные эффекты, такие как параллельные трассы или
многополосные маршруты.
Основная ценность PathStyleExtension заключается в возможности
задавать стиль через функции доступа (accessors),
возвращающие значения для каждого объекта.
getWidth: d => d.thickness
Толщина может задаваться в различных единицах (пиксели или метры), в зависимости от настроек слоя:
widthUnits: 'meters'
или
widthUnits: 'pixels'
Это критически важно при визуализации географических данных, где масштабирование карты влияет на восприятие толщины.
PathStyleExtension предоставляет доступ к параметрам, управляющим поведением соединений сегментов.
Поддерживаются следующие типы:
miter — острые углыround — скруглённые соединенияbevel — срезанные углыПример:
getJointType: d => d.jointType
Где значение может быть строкой или числовым кодом, в зависимости от реализации данных.
Окончания линий влияют на визуальное восприятие траекторий, особенно при отображении маршрутов и потоков.
Поддерживаемые варианты:
butt — обрезанное окончаниеround — округлое окончаниеsquare — квадратное продолжениеПример динамического задания:
getCapRounded: d => d.roundEnds
При включённой поддержке расширения можно комбинировать типы окончаний с различными толщинами и цветами.
Одной из ключевых функций PathStyleExtension является поддержка dashed-геометрии на уровне GPU.
getDashArray: d => d.dashPattern
Формат массива обычно задаёт последовательность:
[длина_штриха, длина_пробела]
Пример:
getDashArray: d => [10, 5]
или более сложные паттерны:
getDashArray: d => [8, 4, 2, 4]
Это позволяет создавать визуально различимые классы маршрутов: активные, второстепенные, временные или скрытые.
Функция смещения позволяет визуально раздвигать линии, построенные по одной и той же геометрии.
new PathStyleExtension({offset: true})
И соответствующий accessor:
getOffset: d => d.sideOffset
Применение:
Внутри WebGL смещение рассчитывается перпендикулярно направлению сегмента, что обеспечивает корректное поведение на кривых участках.
Для острых соединений используется параметр miter lim it, который ограничивает длину «острия» на углах.
getMiterLimit: d => d.miterLimit
При превышении порога система автоматически переключается на bevel-режим, предотвращая артефакты растяжения геометрии.
PathStyleExtension не заменяет PathLayer, а расширяет
его внутреннюю модель атрибутов. Это означает:
Типичный набор параметров слоя:
new PathLayer({
data,
getPath: d => d.path,
getColor: d => d.color,
getWidth: d => d.width,
widthMinPixels: 1,
widthMaxPixels: 10,
extensions: [new PathStyleExtension()]
});
PathStyleExtension проектировался с учётом минимизации CPU-overhead. Основные оптимизации:
Это особенно важно при работе с большими наборами геоданных:
PathStyleExtension позволяет комбинировать несколько параметров одновременно, создавая сложные визуальные модели:
Пример комплексной конфигурации:
new PathLayer({
data,
getPath: d => d.path,
getColor: d => d.color,
getWidth: d => d.width,
getDashArray: d => d.dash,
getOffset: d => d.offset,
extensions: [new PathStyleExtension({offset: true})]
});
При использовании PathStyleExtension важно учитывать ограничения WebGL:
Также следует учитывать, что стилизация применяется в экранных координатах, поэтому визуальный результат зависит от масштаба и зума карты.
Использование PathStyleExtension часто требует пересмотра структуры входных данных. Типичный объект маршрута может включать:
{
path: [[lng, lat], [lng, lat], ...],
width: 4,
color: [255, 0, 0],
dash: [6, 3],
offset: 2,
jointType: 'round'
}
Такая модель делает геометрию и стиль единым источником правды, что упрощает генерацию и трансформацию данных на уровне backend или preprocessing pipeline.
На уровне GPU PathStyleExtension добавляет:
Это позволяет реализовать:
PathStyleExtension широко применяется в задачах визуализации:
За счёт комбинации offset + dash + per-instance width достигается высокая информативность без увеличения геометрической сложности сцены.