В системе рендеринга 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 — булево свойство layout-группы
symbol layer, определяющее, может ли текстовая метка игнорировать
проверку столкновений с другими объектами.
layout: {
"text-field": "{name}",
"text-size": 14,
"text-allow-overlap": false
}
При значении false:
При значении true:
Когда text-allow-overlap: true, система collision
detection меняет поведение:
icon-allow-overlapОднако важно понимать, что это не абсолютное отключение всех правил. Mapbox GL JS всё ещё учитывает:
symbol-z-ordertext-ignore-placementЧасто возникает путаница между text-allow-overlap и
text-ignore-placement.
text-allow-overlap — разрешает визуальное
перекрытиеtext-ignore-placement — игнорирует влияние метки на
размещение других объектовЕсли кратко:
Комбинация этих параметров даёт полный контроль над плотностью текста.
В symbol layer текст и иконка могут существовать одновременно:
layout: {
"text-field": "{name}",
"icon-image": "marker",
"text-allow-overlap": true,
"icon-allow-overlap": false
}
В таком случае:
При обратной конфигурации возможны ситуации, когда иконка “пробивает” текстовые ограничения.
Использование text-allow-overlap: true резко увеличивает
количество отображаемых подписей, особенно в:
Однако это приводит к последствиям:
Тексты начинают перекрывать друг друга, снижая читаемость. Особенно критично при:
Mapbox использует internal ranking для выбора “важных” меток. При включённом overlap этот механизм становится менее заметным, так как визуальная конкуренция отключается.
Отображается больше данных, но хуже воспринимается структура карты.
Collision detection и text-allow-overlap проявляют себя
по-разному в зависимости от масштаба:
"layout": {
"text-field": "{name}",
"text-size": 12,
"text-allow-overlap": true
}
Используется в:
Overlap включают вместе с фильтрами:
"filter": ["==", ["get", "type"], "hospital"],
"layout": {
"text-allow-overlap": true
}
Это позволяет вывести все объекты одного типа без потерь.
Text rendering в Mapbox GL JS основан на SDF (Signed Distance Fields), что обеспечивает:
text-allow-overlap работает уже поверх этой модели, не
влияя на саму генерацию глифов, а только на финальный этап
размещения.
Даже при включённом overlap остаются важные приоритеты:
symbol-sort-keyТаким образом, overlap не превращает систему в хаотичную, а лишь отключает один из фильтров размещения.
На практике text-allow-overlap редко используется
изолированно. Часто его комбинируют:
text-ignore-placementПозволяет создавать “плотные информационные поля”:
"text-allow-overlap": true,
"text-ignore-placement": true
text-optionalПозволяет показывать текст только при наличии свободного места, но игнорировать конфликты при необходимости.
text-variable-anchorДаёт возможность перемещать текст вокруг точки, снижая конфликты даже при overlap.
Интересный аспект: включение text-allow-overlap не
снижает нагрузку, а иногда даже увеличивает её косвенно:
Однако уменьшается CPU нагрузка на collision pruning, так как часть проверок отключается.
При изменении zoom или фильтров:
Это особенно заметно при интерактивных зумах колесом мыши.
Функционально text-allow-overlap можно рассматривать как
переключатель между двумя режимами:
Он не управляет стилем, размером или логикой текста, а только определяет, подчиняется ли текст системе пространственных ограничений или выходит за её пределы.