Stroke и fill параметры

В Kepler.gl стилизация геометрии слоёв строится вокруг двух базовых визуальных свойств: fill (заливка) и stroke (обводка). Эти параметры определяют внешний вид полигонов, линий и точек, формируя читаемость карты, её визуальную иерархию и способность передавать плотность данных.


Fill: заливка геометрии

Параметр fill отвечает за внутреннюю часть геометрического объекта. В контексте Kepler.gl он чаще всего применяется к полигонам (Polygon Layer) и hexagon/grid слоям.

Основные функции fill

  • визуализация плотности или категории данных через цвет
  • создание различий между областями
  • формирование тепловых и тематических карт
  • снижение визуальной нагрузки при работе с большими полигонами

Цветовые параметры fill

В Kepler.gl заливка может задаваться несколькими способами:

  • фиксированный цвет
  • цветовая шкала (color scale)
  • динамическая привязка к атрибутам данных

Пример конфигурации слоя:

const polygonLayer = {
  id: 'polygon-layer',
  type: 'polygon',
  data,
  getPolygon: d => d.geometry,
  getFillColor: d => [255, 100, 100, 180]
};

Здесь массив [R, G, B, A] определяет:

  • R — красный канал
  • G — зелёный канал
  • B — синий канал
  • A — прозрачность

Прозрачность fill

Альфа-канал играет ключевую роль при наложении слоёв. При значениях ниже 255 достигается эффект:

  • визуального смешивания слоёв
  • отображения перекрывающихся объектов
  • уменьшения визуального шума

Особенно важно при работе с hexagon слоями, где плотность данных может перекрывать соседние области.


Stroke: обводка объектов

Параметр stroke управляет линиями контура геометрии. Он применяется к:

  • полигонам (Polygon Layer)
  • линиям (Line Layer)
  • точкам (Point Layer через визуальные эффекты окружности)

Stroke отвечает за:

  • отделение объектов друг от друга
  • повышение читаемости границ
  • визуальное усиление структуры карты

Базовая настройка stroke

const polygonLayer = {
  id: 'polygon-layer',
  type: 'polygon',
  data,
  getPolygon: d => d.geometry,
  getLineColor: d => [0, 0, 0, 255],
  getLineWidth: d => 1
};

Толщина линии (stroke width)

Параметр getLineWidth управляет толщиной обводки.

Особенности поведения:

  • малые значения (0.1–1) — тонкая техническая детализация
  • средние (1–3) — стандартная картографическая визуализация
  • высокие (3+) — акцентирование объектов

В WebGL-рендеринге Kepler.gl толщина линии масштабируется в зависимости от зума, если включены соответствующие настройки слоя.


Взаимодействие fill и stroke

Совместное использование заливки и обводки формирует визуальный баланс слоя.

Типовые комбинации

1. Полигоны с чёткой границей

getFillColor: d => [80, 140, 200, 160],
getLineColor: d => [20, 20, 20, 255],
getLineWidth: 1

Используется для административных границ и территориальных данных.


2. Полупрозрачная заливка без акцента на границы

getFillColor: d => [255, 120, 0, 100],
getLineColor: d => [0, 0, 0, 0]

Подходит для heatmap-подобных визуализаций, где важна плотность, а не форма.


3. Акцентированная обводка при минимальной заливке

getFillColor: d => [0, 0, 0, 30],
getLineColor: d => [255, 0, 0, 255],
getLineWidth: 2

Применяется для выделения границ поверх слабой заливки.


Динамическая стилизация stroke и fill

Kepler.gl позволяет привязывать визуальные параметры к данным через функции доступа.

Цвет на основе атрибута

getFillColor: d => {
  if (d.value > 100) return [255, 0, 0, 200];
  if (d.value > 50) return [255, 165, 0, 180];
  return [0, 200, 100, 150];
}

Изменение толщины обводки по значению

getLineWidth: d => Math.log(d.population) * 0.5

Такой подход позволяет:

  • визуализировать интенсивность явления
  • усиливать различия между объектами
  • создавать многомерную картографическую интерпретацию

Прозрачность как связующий механизм

Взаимодействие fill и stroke особенно сильно зависит от прозрачности:

  • высокая прозрачность fill делает stroke доминирующим элементом
  • низкая прозрачность fill может полностью перекрыть stroke
  • сбалансированные значения обеспечивают равномерное восприятие

Типичные диапазоны:

  • fill alpha: 50–180
  • stroke alpha: 180–255

Stroke в линейных слоях

В LineLayer stroke фактически становится основным визуальным параметром.

const lineLayer = {
  id: 'line-layer',
  type: 'line',
  data,
  getSourcePosition: d => d.from,
  getTargetPosition: d => d.to,
  getColor: d => [0, 120, 255],
  getWidth: d => 2
};

Особенности:

  • отсутствие fill как такового
  • ширина линии заменяет площадь заливки
  • цвет полностью определяет визуальное восприятие

Stroke в точечных слоях

В PointLayer stroke используется для обводки кругов:

const pointLayer = {
  id: 'point-layer',
  type: 'point',
  data,
  getPosition: d => d.coordinates,
  getFillColor: d => [0, 200, 255, 180],
  getLineColor: d => [0, 0, 0],
  getLineWidth: 1
};

Функция обводки здесь:

  • отделяет точки от фона
  • повышает читаемость на плотных участках
  • создаёт эффект маркеров

Оптимизация визуальной нагрузки

При работе с большим количеством данных параметры stroke и fill влияют на производительность WebGL-рендера.

Ключевые факторы:

  • высокая прозрачность увеличивает количество визуального смешивания
  • толстые линии повышают нагрузку на отрисовку
  • сложные динамические функции увеличивают CPU overhead

Рекомендуемые практики:

  • минимизация вычислений внутри getFillColor и getLineWidth
  • использование предрасчитанных атрибутов
  • избегание избыточной детализации stroke при большом зуме

Иерархия восприятия через stroke и fill

Комбинация параметров формирует визуальную иерархию:

  • fill определяет массу и плотность объекта
  • stroke определяет структуру и границы
  • соотношение этих параметров задаёт приоритет восприятия

Сильный stroke при слабом fill переводит объект в категорию «контурных ориентиров», тогда как сильный fill и слабый stroke создают эффект «пятен плотности».


Влияние масштаба (zoom) на stroke и fill

Kepler.gl позволяет адаптировать визуализацию под уровень масштабирования:

  • на малом зуме stroke может исчезать или утончаться
  • на большом зуме stroke усиливается для детализации границ
  • fill может менять прозрачность в зависимости от плотности отображения

Пример:

getLineWidth: d => (zoom > 10 ? 2 : 0.5)

Такой подход обеспечивает:

  • читаемость на разных уровнях карты
  • предотвращение визуального перегруза
  • адаптивную детализацию

Комбинированные эффекты визуализации

Использование stroke и fill в связке позволяет реализовать:

  • градиентные карты плотности
  • административные границы с тематическим наполнением
  • многослойные визуализации с различной прозрачностью
  • акцентирование ключевых объектов поверх фоновых данных

Каждый параметр становится частью общей системы визуального кодирования, где цвет, прозрачность и толщина формируют многомерное представление данных без изменения их геометрии.