В основе Kepler.gl лежит геопространственная модель, построенная на проекции Web Mercator. Эта проекция преобразует сферическую поверхность Земли в плоскость, где координаты широты и долготы интерпретируются в условное декартово пространство. Именно в этом пространстве происходит дальнейшая работа всех слоёв визуализации.
Ключевая особенность заключается в том, что масштабирование в Kepler.gl не является простым изменением размера объектов, а представляет собой сочетание:
Каждый из этих уровней влияет на итоговое восприятие данных.
Зум в Kepler.gl наследуется от deck.gl и работает по принципу экспоненциального изменения масштаба. При увеличении zoom на 1 уровень происходит удвоение детализации отображаемого пространства.
Математически это можно выразить как:
z ^{z}
где z — уровень зума.
Это означает, что:
После проекции географических координат в Web Mercator система переводит их в экранные координаты. На этом этапе вступает в работу матрица преобразований камеры.
Каждая точка проходит через цепочку:
Именно в экранном пространстве применяется масштабирование визуальных параметров: радиусы точек, толщина линий, высота столбцов.
В слоях типа ScatterplotLayer размер точки задаётся в
пикселях или метрах (в зависимости от конфигурации). Важный аспект —
поведение размера при изменении зума.
Существует два подхода:
1. Фиксированный пиксельный размер
Точка сохраняет одинаковый размер на экране независимо от масштаба карты. Это полезно для:
2. Геопривязанный размер
Размер объекта зависит от масштаба карты и географической протяжённости:
Kepler.gl активно использует агрегационные структуры данных:
В этих случаях масштаб влияет не только на визуализацию, но и на саму структуру данных.
Например, hexagon-агрегация строится на основе радиуса ячейки, который связан с уровнем зума:
Связь между зумом и радиусом агрегации можно выразить как:
r(z) = r_0 ^{-z}
где r(z) — радиус ячейки на уровне зума z,
r_0 — базовый радиус.
Масштабирование в Kepler.gl тесно связано с оптимизацией рендеринга. При увеличении количества объектов возникает необходимость в:
GPU-рендеринг через deck.gl позволяет обрабатывать десятки и сотни тысяч объектов, однако производительность зависит от:
Особенно критично поведение при анимации зума, когда пересчитываются все трансформации камеры.
Для линейных слоёв (LineLayer, PathLayer)
масштабирование проявляется в толщине линий и визуальной длине
сегментов.
Существует два режима:
При использовании world space ширина может описываться как:
w(z) = w_0 ^{-z}
где увеличение зума делает линии визуально толще или тоньше в зависимости от режима.
Одной из ключевых задач Kepler.gl является работа с плотными наборами данных. При низком масштабе отображение всех точек невозможно без перегрузки визуального слоя.
Используются следующие стратегии:
Плотность отображения напрямую зависит от отношения количества объектов к площади экрана:
=
где:
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 представляет собой многослойную систему, где:
Эта комбинация позволяет одновременно работать с крупными геоданными и сохранять читаемость на любом уровне детализации.