Метод addLayer в Mapbox GL JS отвечает за добавление
визуального слоя в текущий стиль карты. Слои формируют отображение
географических данных поверх источников (source) и являются
ключевым механизмом рендеринга векторных тайлов, GeoJSON и растровых
данных.
Метод вызывается у экземпляра карты:
map.addLayer(layer, beforeId);
layer (объект слоя) — конфигурация нового слоя. Минимально содержит:
id — уникальный идентификатор слояtype — тип визуализацииsource — источник данных (не всегда обязателен)layout — параметры размещения и поведенияpaint — стилизация отображенияbeforeId (строка, опционально) — идентификатор слоя, перед которым вставляется новый слой. Управляет порядком отрисовки.
Перед добавлением слоя почти всегда требуется регистрация источника
через addSource:
map.addSource('cities', {
type: 'geojson',
data: '/data/cities.geojson'
});
После этого слой связывается с источником:
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities'
});
Исключения составляют некоторые слои, например
background, sky, а также слои, использующие
встроенные источники.
Используется для отображения полигонов.
map.addLayer({
id: 'regions',
type: 'fill',
source: 'states',
paint: {
'fill-color': '#3bb2d0',
'fill-opacity': 0.5
}
});
Применяется для:
Отрисовка линий и контуров.
map.addLayer({
id: 'roads',
type: 'line',
source: 'roads',
paint: {
'line-color': '#ff8800',
'line-width': 2
}
});
Поддерживает:
Отображение точечных данных.
map.addLayer({
id: 'points',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Используется для:
Слой для текста и иконок.
map.addLayer({
id: 'labels',
type: 'symbol',
source: 'places',
layout: {
'text-field': ['get', 'name'],
'text-size': 14,
'icon-image': 'marker-15'
}
});
Поддерживает:
Используется для тайловых изображений.
map.addLayer({
id: 'satellite',
type: 'raster',
source: 'satellite'
});
Применяется для:
Визуализация плотности точек.
map.addLayer({
id: 'heat',
type: 'heatmap',
source: 'points',
paint: {
'heatmap-weight': 1,
'heatmap-intensity': 1,
'heatmap-color': [
'interpolate',
['linear'],
['heatmap-density'],
0, 'blue',
1, 'red'
]
}
});
Используется для:
3D-экструзия полигонов.
map.addLayer({
id: 'buildings',
type: 'fill-extrusion',
source: 'buildings',
paint: {
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-color': '#aaa'
}
});
Применяется для:
Фоновый слой стиля.
map.addLayer({
id: 'background',
type: 'background',
paint: {
'background-color': '#f0f0f0'
}
});
Порядок добавления определяет визуальную иерархию. Последние добавленные слои отображаются поверх предыдущих.
map.addLayer(layerConfig, 'road-label');
Это позволяет точно управлять стеком отрисовки.
Типовые сценарии:
Определяет структуру и поведение слоя:
visibility)layout: {
visibility: 'visible',
'text-field': '{name}'
}
Определяет визуальное оформление:
paint: {
'line-color': '#00ff00',
'line-opacity': 0.8
}
Слои могут отображать только часть данных источника:
filter: ['==', ['get', 'type'], 'park']
Поддерживаются выражения:
Слои могут ограничиваться диапазоном зума:
minzoom: 5,
maxzoom: 14
Это позволяет:
При вызове addLayer происходит:
idsourceОшибки часто возникают при:
idДобавление слоёв возможно только после события загрузки:
map.on('load', () => {
map.addLayer({
id: 'water',
type: 'fill',
source: 'water'
});
});
Без этого состояния стиль может быть неинициализирован.
map.removeLayer('layer-id');
const layer = map.getLayer('layer-id');
map.setPaintProperty('roads', 'line-color', '#0000ff');
map.setLayoutProperty('labels', 'visibility', 'none');
Mapbox GL JS поддерживает декларативные выражения:
paint: {
'circle-radius': [
'interpolate',
['linear'],
['zoom'],
0, 2,
10, 10
]
}
Применяются для:
Ключевые факторы влияния:
Практика оптимизации:
minzoom / maxzoomСлои группируются по типам и отрисовываются в определённой последовательности:
Внутри группы порядок определяется последовательностью
addLayer.
Некоторые слои поддерживают composite-источники через фильтрацию или
объединение данных, но стандартный слой связывается только с одним
source. Для объединения данных применяется:
При изменении данных источника слой автоматически обновляется:
map.getSource('points').setData(newGeoJson);
addLayer при этом повторно не вызывается, что снижает
нагрузку на рендеринг.
sourceid между слоямиpaint свойств для некоторых
типовbeforeId при
добавленииМетод является точкой расширения визуального стиля карты. Через него формируется:
Он напрямую влияет на структуру style JSON, который является основой всей системы Mapbox GL JS.