High contrast режим

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

Высококонтрастная карта опирается на несколько базовых требований к визуальному представлению:

Разделение фона и объектов

  • фоновые слои становятся нейтральными и малонасыщенными
  • важные объекты (дороги, границы, POI) получают усиленный цветовой акцент
  • второстепенные элементы визуально подавляются

Минимизация визуального шума

  • уменьшение количества текстур и декоративных элементов
  • упрощение заливок для landuse и water
  • отказ от сложных градиентов в пользу плоских цветов

Усиление читаемости текста

  • добавление halo (обводки текста)
  • увеличение контраста подписи относительно подложки
  • выбор более жирных начертаний шрифтов

Работа со стилем карты

В Mapbox GL JS высококонтрастный режим чаще всего реализуется через кастомный стиль JSON или модификацию существующих стилей.

Ключевой метод — map.setStyle():

map.setStyle('mapbox://styles/mapbox/dark-v11');

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

После загрузки стиля можно динамически изменять слои:

map.on('style.load', () => {
  map.setPaintProperty('water', 'fill-color', '#000000');
  map.setPaintProperty('land', 'background-color', '#111111');
});

Контраст через цветовую систему

Контрастность в Mapbox GL JS определяется в основном через paint properties:

Цвет заливки (fill-color)

map.setPaintProperty('landcover', 'fill-color', '#1a1a1a');

Для высококонтрастного режима важно избегать близких оттенков. Например:

  • фон: почти чёрный или очень тёмный серый
  • вода: насыщенный, но не агрессивный синий
  • дороги: ярко-белые или жёлтые

Обводка (line-color)

map.setPaintProperty('road-primary', 'line-color', '#ffffff');
map.setPaintProperty('road-primary', 'line-width', 2);

Чем выше контраст между линией и фоном, тем легче воспринимается транспортная сеть.

Управление яркостью и насыщенностью

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

map.setPaintProperty('landuse', 'fill-opacity', 0.3);

Снижение насыщенности второстепенных объектов позволяет сфокусировать внимание на ключевых элементах.

Для raster-слоёв полезны свойства:

map.setPaintProperty('satellite', 'raster-brightness-min', 0.2);
map.setPaintProperty('satellite', 'raster-saturation', -0.8);

Работа с текстом и подписями

Подписи — критически важный элемент высококонтрастного режима.

Halo (обводка текста)

map.setPaintProperty('place-label', 'text-halo-color', '#000000');
map.setPaintProperty('place-label', 'text-halo-width', 2);

Halo создаёт визуальное отделение текста от сложного фона и повышает читаемость на пересечении слоёв.

Цвет текста

map.setPaintProperty('place-label', 'text-color', '#ffffff');

Рекомендуется избегать серых оттенков, если фон также нейтральный.

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

map.setLayoutProperty('place-label', 'text-max-angle', 30);
map.setLayoutProperty('place-label', 'text-allow-overlap', false);

Снижение наложений уменьшает визуальную перегрузку.

Стилизация слоёв через условные выражения

Mapbox GL JS поддерживает expression-based styling, что позволяет адаптировать контраст динамически:

map.setPaintProperty('road', 'line-color', [
  'case',
  ['==', ['get', 'class'], 'motorway'],
  '#ffffff',
  '#888888'
]);

Такой подход позволяет усиливать визуальную иерархию без изменения всей темы карты.

Использование кастомного high contrast theme

В продвинутых реализациях создаётся отдельный стиль, основанный на стандартном, но с переопределёнными слоями:

const highContrastStyle = {
  version: 8,
  sources: { /* источники */ },
  layers: [
    {
      id: 'background',
      type: 'background',
      paint: {
        'background-color': '#000000'
      }
    }
  ]
};

После этого добавляются ключевые слои с повышенным контрастом:

  • дороги — белые или ярко-жёлтые
  • вода — тёмно-синяя или чёрная
  • границы — контрастные линии без прозрачности

Управление визуальной иерархией

Высококонтрастный режим невозможен без правильной иерархии слоёв:

  1. фон (самый тёмный и нейтральный)
  2. природные объекты (с минимальной насыщенностью)
  3. дороги и транспорт
  4. административные границы
  5. подписи и POI (самый высокий приоритет)

В Mapbox GL JS порядок слоёв задаётся явно:

map.moveLayer('road-primary', 'water-label');

Работа с прозрачностью

Opacity — один из ключевых инструментов управления контрастом:

map.setPaintProperty('building', 'fill-opacity', 0.2);

Снижение прозрачности второстепенных объектов увеличивает визуальную чёткость основных слоёв.

Адаптация под пользовательские настройки системы

В некоторых приложениях high contrast режим синхронизируется с системными настройками:

if (window.matchMedia('(prefers-contrast: more)').matches) {
  map.setStyle(highContrastStyle);
}

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

Типичные ошибки при создании высококонтрастных карт

Чрезмерное использование контраста приводит к обратному эффекту:

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

Другой частый дефект — игнорирование текста. Даже при идеальном контрасте слоёв подписи могут становиться нечитаемыми без halo и правильного выбора цвета.

Практика комбинирования слоёв

Эффективная стратегия — комбинирование минималистичной базы и акцентных слоёв:

  • базовая карта: почти монохромная
  • дороги: выделены 2–3 уровня контраста
  • POI: только ключевые категории
  • подписи: усиленный контраст + halo

Такой подход обеспечивает стабильную читаемость независимо от масштаба и плотности данных.