LOD (Level of Detail)

LOD (Level of Detail) в deck.gl представляет собой набор стратегий адаптивного отображения данных в зависимости от масштаба, плотности данных и текущего viewport. Основная цель LOD — сохранить баланс между производительностью и визуальной информативностью при работе с большими пространственными наборами данных.


LOD строится вокруг принципа иерархического упрощения данных:

  • на малых масштабах отображается обобщённая информация;
  • на средних — агрегированные структуры;
  • на крупных — детализированные объекты.

В контексте deck.gl это напрямую связано с параметрами:

  • zoom
  • viewState
  • геометрической плотностью данных
  • вычислительной стоимостью отрисовки

LOD позволяет избежать ситуации, когда миллионы объектов одновременно попадают в WebGL pipeline.


Модель LOD в deck.gl

В deck.gl нет единого “LOD-движка”, вместо этого используется набор паттернов:

1. Tile-based LOD (тайловая модель)

Один из наиболее распространённых подходов основан на разбиении пространства на тайлы:

  • квадродерево (quadtree)
  • XYZ-тайлы (как в Mapbox/Google Maps)
  • геопространственные индексы

Каждый тайл содержит данные разного уровня детализации.

Ключевой механизм:

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

Типичные реализации:

  • MVTLayer
  • TileLayer

Поведение TileLayer

TileLayer управляет жизненным циклом тайлов:

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

MVT как основа LOD для векторных данных

MVTLayer (Mapbox Vector Tiles) — ключевой инструмент LOD для векторной геометрии.

Принцип:

  • сервер отдаёт заранее упрощённую геометрию на каждом zoom уровне
  • клиент не пересчитывает геометрию, а выбирает нужный слой детализации

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

  • геометрия уже “сварена” под конкретный zoom
  • минимальная нагрузка на CPU клиента
  • высокая масштабируемость

LOD здесь реализован на уровне генерации данных, а не рендеринга.


Screen-space LOD и агрегация

Другой класс подходов — LOD в экранных координатах.

Используется, когда данные не имеют тайловой структуры.

Основные техники:

1. Aggregation layers

  • ScreenGridLayer
  • HexagonLayer
  • ContourLayer

Эти слои объединяют точки в ячейки.

Принцип:

  • мир разбивается на регулярную сетку (screen-space или geospatial)
  • точки агрегируются в ячейках
  • на выходе — меньшее число визуальных примитивов

2. H3-based LOD

H3HexagonLayer использует иерархический индекс H3:

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

LOD здесь выражается через:

  • разрешение H3 index
  • zoom-dependent resolution mapping

LOD через геометрическое упрощение

Для сложных геометрий (линии, полигоны) применяется упрощение:

  • Douglas–Peucker algorithm (на сервере или pre-processing)
  • simplification based on zoom level
  • reduction of vertex count

Deck.gl не всегда выполняет упрощение сам, но поддерживает:

  • передачу уже упрощённых геометрий
  • выбор уровня детализации через props

GPU-ориентированный LOD

Важная особенность deck.gl — перенос части LOD логики в GPU.

Instancing

При большом количестве однотипных объектов:

  • используется instanced rendering
  • геометрия хранится один раз
  • трансформации выполняются на GPU

LOD проявляется в:

  • изменении размера инстансов
  • отключении дальних объектов
  • снижении точности атрибутов

Viewport-based culling

LOD тесно связан с отсечением объектов:

1. Frustum culling

Удаляются объекты вне камеры.

2. Pixel-based culling

Если объект меньше одного пикселя:

  • он не рендерится
  • заменяется агрегированным представлением

Это критично для плотных точечных слоёв.


Зависимость LOD от zoom

Zoom — центральная переменная LOD-модели.

В deck.gl:

  • zoom влияет на выбор слоя
  • minZoom и maxZoom определяют границы видимости
  • данные часто привязаны к zoom-уровням

Типичный паттерн:

new TileLayer({
  minZoom: 0,
  maxZoom: 14,
  getTileData: ({x, y, z}) => fetch(`/tiles/${z}/${x}/${y}.json`)
})

LOD здесь полностью дискретный: каждый zoom = отдельный уровень данных.


Кэширование как часть LOD

LOD невозможен без эффективного кэширования:

  • tile cache (LRU)
  • GPU attribute caching
  • binary data reuse

deck.gl минимизирует повторную обработку:

  • тайлы не пересчитываются при панорамировании
  • повторные zoom уровни используют cached results
  • WebGL buffers переиспользуются

Hierarchical LOD структуры

Наиболее эффективные системы используют иерархии:

1. Quadtrees

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

2. Clustering trees

Используются для точечных данных:

  • узлы дерева содержат агрегаты
  • листья содержат реальные точки

LOD в 3D-слоях

Для 3D слоёв (например, экструдированные полигоны):

  • высота может зависеть от zoom
  • детализация геометрии уменьшается на дальних уровнях

Примеры:

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

Dynamic LOD и плавные переходы

Некоторые слои поддерживают плавные переходы между уровнями:

  • interpolation между zoom levels
  • fade-in/fade-out тайлов
  • cross-fade текстур

Это уменьшает “прыжки” визуализации.


Практические стратегии LOD в deck.gl

Стратегия 1: серверный LOD

  • подготовка данных заранее
  • разные уровни детализации
  • быстрый клиентский рендеринг

Стратегия 2: клиентская агрегация

  • raw data приходит целиком
  • агрегация происходит в браузере
  • гибкость выше, но CPU нагрузка больше

Стратегия 3: гибридная модель

  • server: tile partitioning
  • client: aggregation + GPU rendering

Производительность и ограничения LOD

LOD напрямую влияет на:

  • frame rate (FPS)
  • memory footprint
  • network usage
  • GPU fill rate

Основные узкие места:

  • слишком мелкие тайлы → сетевой overhead
  • слишком крупные тайлы → перегруз GPU
  • отсутствие агрегации → CPU bottleneck

LOD и поток данных

При streaming-данных (real-time):

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

Используются:

  • WebSocket streams
  • incremental updates
  • diff-based rendering

Связь LOD и проектирования слоёв

LOD в deck.gl влияет на выбор слоя:

  • TileLayer — пространственный LOD
  • HexagonLayer — агрегационный LOD
  • ScatterplotLayer — density-based LOD
  • GridLayer — screen-space LOD

Выбор слоя фактически определяет стратегию LOD.


Итоговая модель LOD в deck.gl

LOD в deck.gl можно рассматривать как комбинацию трёх уровней:

  1. Data LOD — разные уровни данных (тайлы, MVT)
  2. Render LOD — оптимизация отрисовки (GPU, instancing)
  3. Screen LOD — агрегация в пиксельном пространстве

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