Arc layer

Arc Layer — один из наиболее выразительных слоёв визуализации в Kepler.gl, предназначенный для отображения направленных связей между географическими точками. Он используется для анализа потоков: перемещений людей, грузов, транспорта, сетевых взаимодействий, миграций и любых других данных, где важны связи «источник → назначение».

Arc Layer строится на основе пар координат и визуализирует их в виде дуг, создающих эффект трёхмерного потока над картой. В отличие от простых линий, дуги добавляют восприятие направления, масштаба и интенсивности связи.


Базовая структура данных

Arc Layer требует набор данных, где каждая запись содержит минимум две географические точки:

  • исходная точка (source)
  • целевая точка (target)

Типичная структура объекта:

{
  sourceLat: 40.7128,
  sourceLng: -74.0060,
  targetLat: 34.0522,
  targetLng: -118.2437,
  value: 100
}

Значение полей

  • sourceLat / sourceLng — координаты начала дуги
  • targetLat / targetLng — координаты конца дуги
  • value — числовая метрика, определяющая визуальную интенсивность связи

Поле value не является обязательным, но широко используется для управления толщиной, цветом или яркостью дуги.


Принцип визуализации

Arc Layer строит кривую между двумя точками с использованием интерполяции по сфере. Это означает, что линия не является прямой в экранных координатах, а учитывает кривизну Земли.

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

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

Конфигурация слоя

Arc Layer настраивается через объект слоя в конфигурации Kepler.gl:

const arcLayer = {
  id: 'arc-layer',
  type: 'arc',
  config: {
    dataId: 'flights',
    label: 'Flights Routes',
    color: [255, 140, 0],
    columns: {
      lat0: 'sourceLat',
      lng0: 'sourceLng',
      lat1: 'targetLat',
      lng1: 'targetLng'
    },
    getSourceColor: [0, 128, 255],
    getTargetColor: [255, 0, 128],
    getWidth: 2,
    getHeight: 1
  }
};

Основные параметры конфигурации

columns

Определяет соответствие данных координатам:

  • lat0 / lng0 — начало дуги
  • lat1 / lng1 — конец дуги

Эта абстракция позволяет использовать любые названия полей в датасете, не привязываясь к фиксированной структуре.


getSourceColor и getTargetColor

Позволяют задавать градиент дуги:

getSourceColor: [0, 200, 255],
getTargetColor: [255, 100, 0]

Результат — плавный переход цвета вдоль линии, который визуально подчёркивает направление движения.


getWidth

Определяет толщину дуги.

Может быть:

  • числом (фиксированная толщина)
  • функцией (динамическое вычисление на основе данных)

Пример динамической толщины:

getWidth: d => Math.sqrt(d.value)

getHeight

Контролирует высоту подъёма дуги над поверхностью карты.

  • малые значения — почти плоские линии
  • большие значения — выраженные арки

Высота часто используется для усиления визуальной читаемости пересекающихся потоков.


Цветовые модели и интерполяция

Arc Layer поддерживает несколько подходов к окрашиванию:

1. Статический цвет

Один цвет для всех дуг:

color: [255, 255, 255]

2. Градиент по направлению

getSourceColor: [0, 255, 0],
getTargetColor: [255, 0, 0]

3. Цвет на основе данных

getSourceColor: d => (d.value > 100 ? [255, 0, 0] : [0, 255, 0])

Использование масштаба данных

Arc Layer чувствителен к масштабу значений. Поле value часто используется для:

  • толщины дуги
  • насыщенности цвета
  • фильтрации слабых связей

Пример нормализации:

getWidth: d => d.value / 50

Для больших датасетов применяется логарифмическое преобразование:

getWidth: d => Math.log(d.value + 1)

Производительность

Arc Layer может работать с большим количеством связей, однако нагрузка растёт при увеличении числа дуг.

Факторы, влияющие на производительность:

  • количество точек (source-target пар)
  • сложность вычисления функций color/width
  • использование анимации
  • степень детализации геометрии дуги

Рекомендуемые подходы оптимизации:

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

Взаимодействие с другими слоями

Arc Layer часто комбинируется с другими слоями Kepler.gl:

Scatterplot Layer

Используется для отображения узлов сети:

  • города
  • аэропорты
  • склады

Arc Layer визуализирует связи между ними.


Hexagon Layer

Используется для анализа плотности источников и целей, дополняя потоковую визуализацию.


Point Layer

Может использоваться для маркировки ключевых точек маршрутов.


Анимация направлений

Arc Layer поддерживает визуальную передачу направления движения через:

  • градиент цвета
  • смещение яркости
  • динамическое обновление данных

Пример имитации движения:

getSourceColor: [0, 0, 255],
getTargetColor: [0, 255, 255],

Дополнительная динамика достигается через обновление value во времени.


Геометрическая модель дуги

Arc Layer использует сферическую интерполяцию:

  • точки преобразуются в 3D пространство
  • вычисляется промежуточная кривая
  • дуга поднимается по оси Z
  • затем проецируется обратно на карту

Это позволяет сохранять корректную форму на глобальных расстояниях.


Обработка больших маршрутов

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

Подходы решения:

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

Пример прозрачности:

opacity: 0.5

Сценарии применения

Arc Layer используется в задачах анализа потоков:

  • авиаперелёты между городами
  • логистика и цепочки поставок
  • миграционные процессы
  • сетевые взаимодействия (например, API-запросы)
  • финансовые транзакции между регионами

Связь с датасетами времени

Arc Layer может работать с временными данными, если:

  • каждая запись содержит timestamp
  • используется фильтрация по времени

Пример:

{
  sourceLat: 51.5,
  sourceLng: -0.1,
  targetLat: 48.8,
  targetLng: 2.3,
  timestamp: 1620000000
}

Далее данные можно анимировать через фильтры Kepler.gl.


Поведение при масштабировании карты

Arc Layer адаптируется к уровню zoom:

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

Это обеспечивает стабильную визуальную читаемость при любом уровне приближения.


Внутреннее представление данных

Внутри Kepler.gl Arc Layer преобразуется в набор WebGL-геометрий:

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

Это позволяет обрабатывать тысячи дуг в реальном времени.


Расширенные настройки

Некоторые дополнительные параметры:

{
  greatCircle: true,
  billboard: false,
  opacity: 0.8
}
  • greatCircle — использование геодезической дуги
  • billboard — ориентация в пространстве
  • opacity — прозрачность слоя

Типичные ошибки при работе с Arc Layer

  • перепутанные координаты source/target
  • отсутствие нормализации value
  • перегрузка слоя слишком большим количеством дуг
  • использование одинаковых цветов без градиента, что снижает читаемость
  • чрезмерная высота дуг, ухудшающая восприятие масштаба