getAll, get, add, delete

Работа с источниками данных и слоями в 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.


Получение конкретного объекта: get

Доступ к отдельным сущностям осуществляется через идентификаторы.

Источники данных

const source = map.getSource('points-source');

Метод возвращает объект источника, который зависит от его типа:

  • GeoJSONSource
  • VideoSource
  • ImageSource
  • VectorTileSource
  • RasterSource

Если источник не существует, возвращается undefined, поэтому корректная проверка обязательна:

const source = map.getSource('points-source');

if (source) {
  // работа с источником
}

Слои

const layer = map.getLayer('points-layer');

Возвращается объект слоя из текущего стиля. Слои содержат декларативное описание визуализации:

  • type (circle, line, fill, symbol и др.)
  • paint (визуальные свойства)
  • layout (структура отображения)
  • source (связанный источник)

Отсутствие слоя также приводит к undefined, что требует проверки перед использованием.


Добавление объектов: add

Добавление данных в карту осуществляется через два независимых механизма: источники и слои. Порядок операций имеет значение — слой не может ссылаться на несуществующий источник.

Добавление источника

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');

В этом случае новый слой вставляется перед указанным.


Удаление объектов: delete

Удаление в Mapbox GL JS разделено на два независимых метода:

  • removeSource
  • removeLayer

Удаление слоя

map.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({...});
}

Синхронизация состояния через getStyle

Полное состояние карты может быть извлечено и сериализовано:

const snapshot = map.getStyle();

Этот объект включает:

  • все источники
  • все слои
  • параметры стиля
  • sprite и glyphs

На основе этого состояния возможно восстановление карты или её клонирование:

map.setStyle(snapshot);

Поведение при динамическом обновлении

Mapbox GL JS поддерживает частичное обновление данных без пересоздания слоёв:

const source = map.getSource('points-source');

source.setData(newGeoJson);

Это позволяет избегать повторного add/delete при изменении данных, сохраняя структуру стиля.


Типовые ошибки и ограничения

  • удаление источника при активных слоях приводит к исключению
  • обращение к несуществующему ID возвращает undefined
  • изменение порядка слоёв требует явного пересоздания позиции
  • getStyle() возвращает копию состояния, а не ссылку на живую структуру