Text-allow-overlap

В системе рендеринга Mapbox и библиотеки Mapbox GL JS отображение подписей на карте основано на символическом слое (symbol layer), где текстовые иконки проходят стадию collision detection — проверки на пересечения. Именно здесь параметр text-allow-overlap управляет фундаментальным поведением: разрешением или запретом перекрытия текстовых меток.

Каждая текстовая метка в symbol layer рассматривается как прямоугольная область (bounding box), которая вычисляется на основе:

  • текста (text-field)
  • размера шрифта (text-size)
  • угла наклона (text-rotate)
  • отступов (text-padding)
  • масштаба зума

На этапе отрисовки Mapbox GL JS строит индекс занятости пространства карты. Если новая метка пересекается с уже размещённой, она может быть скрыта — это стандартное поведение collision detection.

Именно это поведение модифицирует text-allow-overlap.

Параметр text-allow-overlap

text-allow-overlap — булево свойство layout-группы symbol layer, определяющее, может ли текстовая метка игнорировать проверку столкновений с другими объектами.

Базовое поведение

layout: {
  "text-field": "{name}",
  "text-size": 14,
  "text-allow-overlap": false
}

При значении false:

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

При значении true:

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

Логика размещения при включённом overlap

Когда text-allow-overlap: true, система collision detection меняет поведение:

  1. Метка помечается как “always render candidate”
  2. Проверка пересечений с другими текстами отключается
  3. Проверка пересечений с иконками зависит от icon-allow-overlap
  4. Метка может накладываться даже на уже закреплённые элементы

Однако важно понимать, что это не абсолютное отключение всех правил. Mapbox GL JS всё ещё учитывает:

  • clip bounds тайла
  • symbol-z-order
  • приоритет слоёв
  • text-ignore-placement

Отличие от text-ignore-placement

Часто возникает путаница между text-allow-overlap и text-ignore-placement.

  • text-allow-overlap — разрешает визуальное перекрытие
  • text-ignore-placement — игнорирует влияние метки на размещение других объектов

Если кратко:

  • overlap = “мне можно накладываться”
  • ignore-placement = “я не мешаю другим”

Комбинация этих параметров даёт полный контроль над плотностью текста.

Взаимодействие с icon-allow-overlap

В symbol layer текст и иконка могут существовать одновременно:

layout: {
  "text-field": "{name}",
  "icon-image": "marker",
  "text-allow-overlap": true,
  "icon-allow-overlap": false
}

В таком случае:

  • текст может накладываться на другие тексты
  • но не может перекрывать иконки, если это запрещено
  • иконка остаётся доминирующим элементом слоя

При обратной конфигурации возможны ситуации, когда иконка “пробивает” текстовые ограничения.

Практическое влияние на плотность карты

Использование text-allow-overlap: true резко увеличивает количество отображаемых подписей, особенно в:

  • городских центрах
  • плотных POI-кластерах
  • дорожных сетях
  • слоях с административными границами

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

1. Перегрузка визуального пространства

Тексты начинают перекрывать друг друга, снижая читаемость. Особенно критично при:

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

2. Снижение приоритета ранжирования

Mapbox использует internal ranking для выбора “важных” меток. При включённом overlap этот механизм становится менее заметным, так как визуальная конкуренция отключается.

3. Рост визуального шума

Отображается больше данных, но хуже воспринимается структура карты.

Поведение на разных zoom уровнях

Collision detection и text-allow-overlap проявляют себя по-разному в зависимости от масштаба:

Низкий zoom (мир / континенты)

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

Средний zoom (города)

  • баланс между читаемостью и плотностью
  • overlap полезен для отображения районов и улиц

Высокий zoom (улицы / здания)

  • overlap позволяет отображать максимум POI
  • без него многие подписи исчезают полностью

Типичные сценарии применения

Карты с максимальной информационной насыщенностью

"layout": {
  "text-field": "{name}",
  "text-size": 12,
  "text-allow-overlap": true
}

Используется в:

  • аналитических панелях
  • внутренних GIS-системах
  • мониторинге инфраструктуры

Динамические слои с фильтрацией

Overlap включают вместе с фильтрами:

"filter": ["==", ["get", "type"], "hospital"],
"layout": {
  "text-allow-overlap": true
}

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

Связь с SDF и рендерингом текста

Text rendering в Mapbox GL JS основан на SDF (Signed Distance Fields), что обеспечивает:

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

text-allow-overlap работает уже поверх этой модели, не влияя на саму генерацию глифов, а только на финальный этап размещения.

Приоритеты и порядок слоёв

Даже при включённом overlap остаются важные приоритеты:

  • порядок слоёв (layer order)
  • symbol-sort-key
  • приоритеты источника данных
  • тип геометрии (Point vs LineString label placement)

Таким образом, overlap не превращает систему в хаотичную, а лишь отключает один из фильтров размещения.

Комбинации с другими параметрами symbol layer

На практике text-allow-overlap редко используется изолированно. Часто его комбинируют:

С text-ignore-placement

Позволяет создавать “плотные информационные поля”:

"text-allow-overlap": true,
"text-ignore-placement": true

С text-optional

Позволяет показывать текст только при наличии свободного места, но игнорировать конфликты при необходимости.

С text-variable-anchor

Даёт возможность перемещать текст вокруг точки, снижая конфликты даже при overlap.

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

Интересный аспект: включение text-allow-overlap не снижает нагрузку, а иногда даже увеличивает её косвенно:

  • больше элементов проходит этап рендера
  • увеличивается количество draw calls
  • растёт GPU нагрузка при большом количестве символов

Однако уменьшается CPU нагрузка на collision pruning, так как часть проверок отключается.

Поведение при анимации и transition

При изменении zoom или фильтров:

  • метки могут “появляться внезапно”
  • отсутствует плавное исчезновение из-за отсутствия collision suppression
  • возможны резкие скачки плотности текста

Это особенно заметно при интерактивных зумах колесом мыши.

Итоговая модель поведения параметра

Функционально text-allow-overlap можно рассматривать как переключатель между двумя режимами:

  • строгий режим картографической читаемости (false)
  • режим максимального отображения данных (true)

Он не управляет стилем, размером или логикой текста, а только определяет, подчиняется ли текст системе пространственных ограничений или выходит за её пределы.