Scope ограничения

В Mapbox GL JS архитектура построена вокруг изолированных областей ответственности, где каждый уровень — от источника данных до рендера — имеет собственные ограничения видимости и влияния. Понимание этих ограничений критично для предсказуемого поведения карт, особенно при работе с большим количеством слоёв, источников и динамическими стилями.

Scope в данном контексте не является единым понятием языка JavaScript; он распределён между несколькими подсистемами: стилем карты, источниками данных, слоями, выражениями, событиями и WebGL-рендером.


Scope стиля (Style Scope)

Стиль в Mapbox GL JS представляет собой изолированное описание визуального состояния карты. Он определяет:

  • источники данных (sources)
  • слои (layers)
  • спрайты (sprite)
  • шрифты (glyphs)
  • параметры отображения (light, transition)

Ограниченность стиля

Стиль не имеет прямого доступа к внешнему состоянию приложения. Это означает:

  • нельзя передавать произвольные JavaScript-объекты внутрь стиля
  • нельзя выполнять произвольный код внутри описания стиля
  • все динамические изменения должны проходить через API Mapbox GL JS

Стиль существует как декларативная структура, сериализуемая в JSON, что ограничивает его scope строго описанными полями спецификации.


Scope источников данных (Source Scope)

Каждый источник данных (geojson, vector tiles, raster tiles) существует в собственной области видимости.

Основные ограничения:

  • слой может ссылаться только на те источники, которые зарегистрированы в текущем стиле
  • источник не может быть «частично видимым» — он либо подключён, либо нет
  • данные источника доступны только в рамках слоёв, которые его используют

Важный аспект изоляции

Несколько слоёв могут использовать один источник, но:

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

Таким образом, scope источника — глобальный внутри карты, но локальный в контексте слоя.


Scope слоёв (Layer Scope)

Слой — это основная единица визуализации. Его scope ограничен следующими параметрами:

  • source и source-layer (для vector tiles)
  • фильтры (filter expressions)
  • paint properties
  • layout properties

Изоляция слоёв

Каждый слой:

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

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

Порядок отрисовки как часть scope

Z-index в Mapbox GL JS определяется порядком слоёв в стиле:

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

Scope выражений (Expressions Scope)

Выражения в Mapbox GL JS — это мини-язык для вычисления значений свойств.

Они работают в строго ограниченной среде:

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

Доступные входные данные

Выражения могут использовать только:

  • свойства фичи (feature properties)
  • zoom level
  • feature state
  • глобальные переменные стиля (limited)
  • константы

Изоляция вычислений

Каждое выражение:

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

Это делает scope выражений строго функциональным.


Scope событий (Event Scope)

Mapbox GL JS предоставляет систему событий (click, hover, move), которая имеет локализованный scope.

Уровни событий:

  • карта (map-level events)
  • слой (layer-specific events)
  • feature (feature-based events)

Ограничения событийного scope:

  • событие всегда связано с конкретным canvas контекстом
  • события не «перетекают» между картами
  • доступ к данным ограничен результатом hit-testing

Feature scope в событиях

При клике на объект:

  • возвращается только набор фич в точке клика
  • нет доступа ко всем данным источника
  • выборка ограничена текущим zoom и viewport

Scope рендеринга (WebGL Scope)

Рендеринг в Mapbox GL JS основан на WebGL, что вводит аппаратные ограничения scope.

Основные ограничения:

  • лимиты GPU на количество вершин и фрагментов
  • ограничение числа одновременно активных текстур
  • batch-рендеринг слоёв
  • невозможность прямого вмешательства в shader pipeline

Изоляция контекста

Каждая карта:

  • имеет собственный WebGL context
  • не делит GPU память с другими картами
  • полностью изолирована по рендеру

Это означает, что scope рендера строго ограничен экземпляром карты.


Scope данных в тайлах (Tile Scope)

Vector tiles и raster tiles формируют отдельный уровень ограничения.

Характеристики tile scope:

  • каждый тайл содержит только часть глобальных данных
  • данные загружаются по мере необходимости (on-demand)
  • видимость определяется текущим zoom и viewport

Ограничение контекста:

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

Таким образом, scope данных распределён пространственно.


Scope feature-state

Feature state — механизм временного состояния объектов.

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

  • состояние привязано к конкретному feature ID
  • не наследуется между источниками
  • живёт в рамках экземпляра карты

Ограничения:

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

Feature state имеет локальный, нестабильный scope.


Scope ресурсов (Glyphs и Sprites)

Шрифты и иконки также находятся в ограниченном scope.

Glyph scope:

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

Sprite scope:

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

Scope экземпляра карты (Map Instance Scope)

Каждый экземпляр карты — полностью автономная единица.

Внутренние ограничения:

  • собственный стиль
  • собственный WebGL контекст
  • собственные источники данных
  • собственный event loop обработки взаимодействий

Изоляция экземпляров:

Несколько карт на одной странице:

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

Scope в архитектуре Mapbox GL JS

Внутренняя архитектура Mapbox построена вокруг строгого разделения:

  • Style scope — декларативный слой описания
  • Data scope — тайлы и источники
  • Render scope — WebGL pipeline
  • Interaction scope — события и hit-testing
  • State scope — feature-state и UI-состояния

Каждый слой изолирован и взаимодействует только через строго определённые API-границы.


Ограничения глобального scope JavaScript

Несмотря на то что Mapbox GL JS используется внутри JavaScript-приложений, его внутренние системы намеренно ограничивают доступ к внешнему scope:

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

Эта модель предотвращает непредсказуемые побочные эффекты и делает поведение карты детерминированным.


Производные ограничения scope при масштабировании

При увеличении количества данных и слоёв проявляются дополнительные ограничения:

  • рост числа draw calls ограничивает производительность WebGL scope
  • большое количество источников увеличивает давление на tile scope
  • сложные выражения увеличивают нагрузку expression scope
  • частые обновления feature-state создают конкуренцию за state scope

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