В веб-картографии цвет является одним из ключевых каналов передачи информации, но одновременно — одним из наиболее уязвимых с точки зрения восприятия. Ошибки в подборе палитры могут полностью скрыть смысл данных для части пользователей или сделать интерфейс трудным для интерпретации в условиях слабого освещения, низкой контрастности экранов или дальтонизма.
В контексте рендеринга карт на основе MapLibre GL JS цветовая доступность реализуется не как отдельная функция, а как совокупность решений в стилях, источниках данных и логике визуального кодирования слоёв.
Цветовая доступность базируется на нескольких фундаментальных принципах:
Различимость вместо декоративности Цвет должен не украшать, а различать сущности: дороги разных классов, типы объектов, уровни интенсивности явлений.
Независимость от одного канала восприятия Информация не должна кодироваться только цветом. Любое цветовое различие должно поддерживаться формой, текстурой, толщиной линии или подписью.
Контраст как структурный элемент Контраст — это не эстетика, а способ группировки слоёв и иерархии данных.
Стабильность интерпретации Одинаковые цвета должны сохранять одинаковый смысл по всей карте и при изменении масштаба.
Наиболее распространённые формы нарушений цветового зрения:
Комбинации красного и зелёного считаются критически нежелательными для кодирования категорий.
Чрезмерная насыщенность снижает различимость соседних объектов и создаёт визуальный шум, особенно в плотных городских слоях.
Подписи на карте требуют устойчивого контраста с подложкой, который должен сохраняться при смене масштабов и типов базовой карты.
В MapLibre GL JS стили описываются через JSON-структуры, совместимые со спецификацией Mapbox Style. Цвет задаётся через свойства слоёв:
paint — визуальные свойстваlayout — структура отображенияПример базового слоя:
{
"id": "water",
"type": "fill",
"source": "osm",
"source-layer": "water",
"paint": {
"fill-color": "#2a6f97",
"fill-opacity": 0.8
}
}
Проблема цветовой доступности здесь заключается в том, что фиксированный цвет не адаптируется к контексту (масштаб, фон, режим отображения).
MapLibre поддерживает выражения, позволяющие динамически изменять цвет в зависимости от данных.
Пример градиента плотности:
"fill-color": [
"interpolate",
["linear"],
["get", "density"],
0, "#e8f5e9",
10, "#a5d6a7",
50, "#66bb6a",
100, "#1b5e20"
]
С точки зрения доступности важно:
Базовая карта часто является наиболее проблемным элементом: она содержит множество визуальных слоёв, конкурирующих с тематическими данными.
1. Обводка (stroke / halo) Используется для текста и символов:
"text-halo-color": "#ffffff",
"text-halo-width": 2
Это увеличивает читаемость независимо от цвета фона.
2. Упрощение базового слоя
Снижение насыщенности фоновых слоёв:
3. Управление прозрачностью
"fill-opacity": 0.5
Позволяет слоям не конфликтовать визуально.
Безопасные стратегии построения палитры:
Вместо различий по оттенку:
Одна из наиболее устойчивых комбинаций для категориальных данных:
Подходит для аналитических слоёв:
При отображении категорий (например, типы объектов) нельзя полагаться только на цвет.
Пример линии с типизацией:
"line-dasharray": [
"match",
["get", "type"],
"railway", [2, 2],
"road", [1, 0],
[1, 0]
]
Текстовые слои часто являются наиболее критичными для доступности.
text-colortext-halo-colortext-halo-widthПример:
"paint": {
"text-color": "#1a1a1a",
"text-halo-color": "#ffffff",
"text-halo-width": 1.5
}
Один из практических способов тестирования — симуляция отсутствия цвета.
Методики:
Если различимость исчезает — кодирование выполнено только через цвет, что является ошибкой.
Данные часто управляют визуальным представлением напрямую.
Если числовое значение напрямую связано с цветом без нормализации, возникает:
Использование квантизации:
"fill-color": [
"step",
["get", "value"],
"#d4e157",
10, "#ffee58",
50, "#ff7043",
100, "#d32f2f"
]
Step-функции позволяют контролировать различимость диапазонов.
В городских стилях большое количество слоёв создаёт проблему наложения цветов.
Пример приоритизации:
Хотя MapLibre не диктует дизайн режимов, стили могут адаптироваться:
Пример переключения цвета через expression:
"fill-color": [
"case",
["boolean", ["get", "night"], false],
"#1c1c1c",
"#e0f7fa"
]
Проектирование палитры в картографии требует итеративного подхода:
Ключевым критерием остаётся не эстетическая согласованность, а устойчивость интерпретации при деградации визуальных условий.