Размер и масштабирование

Пространственная модель и система координат

В основе Kepler.gl лежит геопространственная модель, построенная на проекции Web Mercator. Эта проекция преобразует сферическую поверхность Земли в плоскость, где координаты широты и долготы интерпретируются в условное декартово пространство. Именно в этом пространстве происходит дальнейшая работа всех слоёв визуализации.

Ключевая особенность заключается в том, что масштабирование в Kepler.gl не является простым изменением размера объектов, а представляет собой сочетание:

  • зума карты (camera zoom)
  • преобразования координат через проекцию
  • масштабирования визуальных свойств слоёв

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


Зум как базовый механизм масштабирования

Зум в Kepler.gl наследуется от deck.gl и работает по принципу экспоненциального изменения масштаба. При увеличении zoom на 1 уровень происходит удвоение детализации отображаемого пространства.

Математически это можно выразить как:

z ^{z}

где z — уровень зума.

Это означает, что:

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

Экранные координаты и трансформация размеров

После проекции географических координат в Web Mercator система переводит их в экранные координаты. На этом этапе вступает в работу матрица преобразований камеры.

Каждая точка проходит через цепочку:

  1. Географические координаты (lon, lat)
  2. Web Mercator проекция
  3. Мировые координаты (world space)
  4. Камерные координаты (view space)
  5. Экранные координаты (screen space)

Именно в экранном пространстве применяется масштабирование визуальных параметров: радиусы точек, толщина линий, высота столбцов.


Масштаб точечных слоёв

В слоях типа ScatterplotLayer размер точки задаётся в пикселях или метрах (в зависимости от конфигурации). Важный аспект — поведение размера при изменении зума.

Существует два подхода:

1. Фиксированный пиксельный размер

Точка сохраняет одинаковый размер на экране независимо от масштаба карты. Это полезно для:

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

2. Геопривязанный размер

Размер объекта зависит от масштаба карты и географической протяжённости:

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

Масштабирование агрегированных слоёв

Kepler.gl активно использует агрегационные структуры данных:

  • Hexagon layers
  • Grid layers
  • Cluster layers

В этих случаях масштаб влияет не только на визуализацию, но и на саму структуру данных.

Например, hexagon-агрегация строится на основе радиуса ячейки, который связан с уровнем зума:

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

Связь между зумом и радиусом агрегации можно выразить как:

r(z) = r_0 ^{-z}

где r(z) — радиус ячейки на уровне зума z, r_0 — базовый радиус.


Влияние размера данных на производительность

Масштабирование в Kepler.gl тесно связано с оптимизацией рендеринга. При увеличении количества объектов возникает необходимость в:

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

GPU-рендеринг через deck.gl позволяет обрабатывать десятки и сотни тысяч объектов, однако производительность зависит от:

  • количества вершин
  • сложности шейдеров
  • частоты пересчёта данных при зуме

Особенно критично поведение при анимации зума, когда пересчитываются все трансформации камеры.


Масштабирование линий и маршрутов

Для линейных слоёв (LineLayer, PathLayer) масштабирование проявляется в толщине линий и визуальной длине сегментов.

Существует два режима:

  • screen space width — толщина линии фиксирована в пикселях
  • world space width — толщина зависит от масштаба карты

При использовании world space ширина может описываться как:

w(z) = w_0 ^{-z}

где увеличение зума делает линии визуально толще или тоньше в зависимости от режима.


Масштабирование плотности данных

Одной из ключевых задач Kepler.gl является работа с плотными наборами данных. При низком масштабе отображение всех точек невозможно без перегрузки визуального слоя.

Используются следующие стратегии:

  • агрегация (hexbin, grid)
  • sampling (выбор подмножества точек)
  • фильтрация по атрибутам
  • динамическое изменение уровня детализации

Плотность отображения напрямую зависит от отношения количества объектов к площади экрана:

=

где:

  • N — количество объектов
  • A — площадь отображаемой области

Логарифмическое восприятие масштаба

Человеческое восприятие масштаба не является линейным, поэтому в Kepler.gl используются логарифмические и экспоненциальные зависимости для управления визуальной плотностью.

Изменение масштаба карты воспринимается как:

S = (1 + z)

где S — субъективное восприятие масштаба.

Это объясняет, почему небольшие изменения zoom на высоких уровнях дают более сильный визуальный эффект, чем на низких.


Синхронизация масштаба между слоями

Kepler.gl позволяет комбинировать несколько слоёв, каждый из которых может иметь собственные правила масштабирования. В результате возникает задача согласования:

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

Согласование происходит через единый camera state, где zoom является общим параметром, а визуальные свойства нормализуются относительно него.


Масштабирование и фильтры по зуму

Фильтрация данных по уровню масштаба позволяет ограничивать отображение объектов в зависимости от zoom range. Это используется для:

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

Каждый объект может иметь диапазон видимости:

z_{min} z z_{max}

где объект активен только внутри заданного интервала масштабов.


Масштабирование в анимации камеры

При плавных переходах между уровнями зума используется интерполяция. Камера изменяет своё состояние непрерывно, а все слои пересчитываются в реальном времени.

Интерполяция масштаба часто выполняется по экспоненте:

z(t) = z_0 e^{kt}

где t — время анимации, k — коэффициент ускорения.


Итоговая модель масштабирования

Масштабирование в Kepler.gl представляет собой многослойную систему, где:

  • геометрический масштаб задаётся Web Mercator
  • визуальный масштаб управляется deck.gl
  • агрегация зависит от уровня zoom
  • восприятие корректируется логарифмическими зависимостями
  • каждый слой имеет собственную стратегию масштабирования

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