Работа с источниками данных и слоями в Mapbox GL JS строится вокруг иммутабельного стиля карты, где все визуальные элементы описываются через единый style-объект. Управление этим состоянием реализовано через набор методов, обеспечивающих доступ к объектам, их создание, выборку и удаление.
В Mapbox GL JS отсутствует прямой метод getAll в
классическом CRUD-формате, однако эквивалентная функциональность
достигается через доступ к стилю карты.
Структура стиля содержит два ключевых массива:
sources — источники данныхlayers — слои визуализацииПолучение полного набора выполняется через:
const style = map.getStyle();
const allSources = style.sources;
const allLayers = style.layers;
map.getStyle() возвращает полное описание текущего
состояния карты. Это наиболее близкий аналог операции «получить
всё».
Особенность структуры:
sources представлен объектом, где ключ — идентификатор
источникаlayers представлен массивом, где порядок имеет
критическое значение для отрисовкиФактически «getAll» в контексте Mapbox GL JS — это работа с сериализованным стилем, а не с отдельными сущностями через API.
Доступ к отдельным сущностям осуществляется через идентификаторы.
const source = map.getSource('points-source');
Метод возвращает объект источника, который зависит от его типа:
GeoJSONSourceVideoSourceImageSourceVectorTileSourceRasterSourceЕсли источник не существует, возвращается undefined,
поэтому корректная проверка обязательна:
const source = map.getSource('points-source');
if (source) {
// работа с источником
}
const layer = map.getLayer('points-layer');
Возвращается объект слоя из текущего стиля. Слои содержат декларативное описание визуализации:
type (circle, line, fill, symbol и др.)paint (визуальные свойства)layout (структура отображения)source (связанный источник)Отсутствие слоя также приводит к undefined, что требует
проверки перед использованием.
Добавление данных в карту осуществляется через два независимых механизма: источники и слои. Порядок операций имеет значение — слой не может ссылаться на несуществующий источник.
map.addSource('points-source', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
Источник регистрируется в стиле и становится доступным для всех слоёв.
Ключевые параметры:
type — тип источникаdata — данные (для GeoJSON)url — внешний ресурс (для vector/raster tiles)tiles — шаблоны тайловПовторное добавление источника с тем же ID вызывает ошибку, так как идентификаторы в стиле должны быть уникальными.
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points-source',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Слои добавляются в порядке визуальной композиции. При необходимости можно управлять позицией:
map.addLayer(layerDefinition, 'existing-layer-id');
В этом случае новый слой вставляется перед указанным.
Удаление в Mapbox GL JS разделено на два независимых метода:
removeSourceremoveLayermap.removeLayer('points-layer');
Слой удаляется из стиля, но не влияет напрямую на источник данных.
Важно учитывать зависимость: слой должен быть удалён до удаления источника, иначе возникнет ошибка.
map.removeSource('points-source');
После удаления источник становится недоступным, а все связанные слои должны быть предварительно очищены.
Типичная последовательность удаления:
if (map.getLayer('points-layer')) {
map.removeLayer('points-layer');
}
if (map.getSource('points-source')) {
map.removeSource('points-source');
}
Стиль карты в Mapbox GL JS является реактивной структурой. Любое
изменение через add или delete немедленно
вызывает перерасчёт рендера.
Особенности поведения:
Идентификаторы источников и слоёв должны быть уникальными. Конфликты возникают при повторном добавлении:
map.addSource('id', {...});
map.addSource('id', {...}); // ошибка
Для безопасной работы применяется проверка:
if (!map.getSource('id')) {
map.addSource('id', {...});
}
Аналогично для слоёв:
if (!map.getLayer('id')) {
map.addLayer({...});
}
Полное состояние карты может быть извлечено и сериализовано:
const snapshot = map.getStyle();
Этот объект включает:
На основе этого состояния возможно восстановление карты или её клонирование:
map.setStyle(snapshot);
Mapbox GL JS поддерживает частичное обновление данных без пересоздания слоёв:
const source = map.getSource('points-source');
source.setData(newGeoJson);
Это позволяет избегать повторного add/delete при
изменении данных, сохраняя структуру стиля.
undefinedgetStyle() возвращает копию состояния, а не ссылку на
живую структуру