Векторные стили в Mapbox GL JS построены на системе слоёв, где каждый визуальный компонент карты представлен отдельным слоем с привязкой к источнику данных. Дорожная сеть почти всегда является частью базового стиля и включает множество подслоёв: магистрали, второстепенные дороги, улицы, мосты, тоннели и подписи. Исключение дорог из отображения сводится к управлению этими слоями через API стиля и модификации их свойств или фильтров.
В стандартных стилях Mapbox дорожная сеть представлена не одним слоем, а группой:
Все эти слои обычно подключены к источнику composite, который агрегирует данные из векторных тайлов.
Ключевая особенность архитектуры заключается в том, что визуальное «исключение дорог» не означает удаление данных. Речь идёт исключительно о деактивации рендеринга слоёв.
Наиболее прямой способ исключить дороги — изменение свойства layout.visibility для каждого слоя.
map.on('load', () => {
const layers = map.getStyle().layers;
layers.forEach(layer => {
if (layer.id.includes('road')) {
map.setLayoutProperty(layer.id, 'visibility', 'none');
}
});
});
В этом подходе используется обход всех слоёв стиля и проверка идентификатора. Метод универсален, но зависит от структуры конкретного стиля, поскольку названия слоёв могут отличаться.
Более контролируемый способ — применение фильтрации по свойствам
слоя. Некоторые стили содержат поле layer["source-layer"],
позволяющее точнее определить принадлежность к дорожной категории.
map.getStyle().layers.forEach(layer => {
if (layer['source-layer'] === 'road') {
map.setLayoutProperty(layer.id, 'visibility', 'none');
}
});
Однако в большинстве официальных стилей Mapbox дорожная сеть разделена на несколько source-layer, поэтому фильтрация только по этому признаку может быть недостаточной.
В случаях, когда требуется полное исключение дорожной графики без возможности повторного включения, используется удаление слоёв.
map.on('load', () => {
const layers = map.getStyle().layers.slice();
for (const layer of layers) {
if (layer.id.startsWith('road') ||
layer.id.includes('bridge') ||
layer.id.includes('tunnel')) {
map.removeLayer(layer.id);
}
}
});
Этот метод изменяет сам стиль и подходит для построения «чистых» картографических подложек, например для аналитических визуализаций или кастомных визуальных слоёв поверх геоданных.
Дорожные слои часто занимают промежуточное положение в стекe рендеринга: между landuse и label слоями. При удалении дорог важно учитывать, что часть объектов (например, подписи или контуры районов) может визуально измениться из-за отсутствия опорной геометрии.
Проверка порядка слоёв осуществляется через:
console.log(map.getStyle().layers.map(l => l.id));
Изменение порядка не влияет на исключение дорог напрямую, но важно при частичном скрытии, когда некоторые дорожные элементы остаются активными.
Более устойчивый подход к исключению дорог — редактирование стиля на уровне Mapbox Studio. В редакторе можно:
Такой подход уменьшает необходимость манипуляций в рантайме и снижает нагрузку на клиент.
При загрузке кастомного стиля:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/custom/style-id'
});
Дорожная сеть уже отсутствует на уровне конфигурации.
Исключение дорог часто применяется как часть режимов визуализации: «чистая карта», «аналитическая подложка», «тепловая карта без контекста дорог».
Реализация переключения:
function toggleRoads(visible) {
const visibility = visible ? 'visible' : 'none';
map.getStyle().layers.forEach(layer => {
if (layer.id.includes('road')) {
map.setLayoutProperty(layer.id, 'visibility', visibility);
}
});
}
Такой механизм позволяет управлять слоем без перезагрузки стиля.
Мосты и тоннели часто визуально связаны с дорогами, но могут существовать как отдельные слои. Исключение только road-* слоёв иногда оставляет визуальные артефакты:
Поэтому полное исключение дорожной сети требует расширенного списка:
const exclude = ['road', 'bridge', 'tunnel'];
map.getStyle().layers.forEach(layer => {
if (exclude.some(prefix => layer.id.includes(prefix))) {
map.setLayoutProperty(layer.id, 'visibility', 'none');
}
});
Дорожные подписи часто отделены от геометрии и находятся в слое road-label или related label layers. Их исключение требует отдельной обработки.
if (layer.id.includes('road-label')) {
map.setLayoutProperty(layer.id, 'visibility', 'none');
}
Без удаления label-слоёв карта может сохранять текстовую привязку к отсутствующим дорогам, что создаёт визуальную несогласованность.
Изменение видимости большого количества слоёв одновременно может вызывать:
Оптимизация достигается через групповые операции и минимизацию количества вызовов setLayoutProperty.
Более эффективная стратегия — отключение слоёв через изменение стиля целиком, а не по одному слою.
В некоторых кастомных стилях возможно использование фильтра на уровне source-layer:
map.setFilter('road-primary', ['==', ['get', 'class'], 'none']);
Этот метод применим только если стиль заранее поддерживает фильтруемые свойства дорожной сети. В стандартных стилях Mapbox подобная стратегия ограничена.
В реальных проектах применяется сочетание методов:
Такой подход обеспечивает гибкость между динамическим управлением и статической конфигурацией.
При использовании собственных векторных тайлов структура дорожных слоёв может быть полностью переопределена. В этом случае идентификаторы слоёв зависят от схемы данных:
Исключение дорог становится задачей согласования client-side логики с server-side схемой данных.
map.setLayoutProperty('highways', 'visibility', 'none');
При смене стиля карты (например, light → dark → satellite) дорожные слои пересоздаются. Это означает, что любые изменения visibility необходимо повторно применять:
map.on('styledata', () => {
hideRoads();
});
Без повторного применения логики исключения дорог изменения могут быть утрачены после переключения стиля.
В спутниковых стилях дороги часто представлены поверх изображения в виде полупрозрачных векторных слоёв. Их исключение приводит к:
При этом спутниковый слой остаётся неизменным, так как он является raster source и не зависит от vector layers.
Исключение дорог в Mapbox GL JS представляет собой управление иерархией слоёв, где ключевыми механизмами выступают:
Каждый метод влияет на разные уровни архитектуры рендеринга, от временного скрытия до полного удаления элементов из визуальной модели карты.