Удаление источников данных в MapLibre GL JS представляет собой критически важную часть управления жизненным циклом карты. Источники (sources) напрямую связаны со слоями (layers), и неправильный порядок удаления или отсутствие контроля зависимостей приводит к ошибкам выполнения и утечкам памяти.
Источник в MapLibre GL JS — это объект, который предоставляет данные для визуализации на карте. Он может быть представлен в виде GeoJSON, векторных тайлов, растровых данных или других поддерживаемых форматов.
Удаление источника выполняется методом:
map.removeSource('source-id');
Ключевое условие корректного удаления — отсутствие слоёв, которые используют данный источник. Попытка удалить источник, связанный со слоем, приводит к ошибке.
Каждый слой (layer) в стиле карты опирается на конкретный источник. Связь имеет строгую зависимость:
Пример зависимости:
map.addSource('cities', {
type: 'geojson',
data: citiesGeojson
});
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities'
});
Удаление источника без предварительного удаления слоя нарушает эту цепочку.
Корректный порядок операций при удалении всегда обратный созданию:
if (map.getLayer('cities-layer')) {
map.removeLayer('cities-layer');
}
if (map.getSource('cities')) {
map.removeSource('cities');
}
Несоблюдение порядка приводит к исключениям, поскольку MapLibre GL JS проверяет целостность стиля перед изменением структуры.
Метод map.removeSource(id) выполняет следующие
действия:
Особенности:
Перед удалением источника используется проверка:
const source = map.getSource('cities');
if (source) {
map.removeSource('cities');
}
Метод map.getSource возвращает объект источника или
undefined, если он отсутствует в стиле.
Аналогично используется проверка слоя:
const layer = map.getLayer('cities-layer');
Наиболее распространённые ошибки:
1. Удаление источника с активными слоями
Error: Source "id" cannot be removed while layer "layer-id" is using it
Причина — нарушение зависимости слой → источник.
2. Повторное удаление источника
Вызов removeSource для уже удалённого источника приводит
к исключению, поскольку стиль больше не содержит данного
идентификатора.
3. Попытка удаления до загрузки стиля
Если стиль карты ещё не загружен, операции удаления недоступны:
map.on('load', () => {
map.removeSource('cities');
});
В приложениях с динамическими данными источники часто создаются и удаляются в зависимости от состояния интерфейса.
Пример замены источника:
function updateCities(data) {
if (map.getSource('cities')) {
map.removeSource('cities');
}
map.addSource('cities', {
type: 'geojson',
data
});
}
Такой подход применяется при полной перезагрузке набора данных.
Удаление источника не всегда требуется. Для GeoJSON-источников предусмотрено обновление данных:
const source = map.getSource('cities');
source.setData(newData);
Использование setData предпочтительнее, поскольку:
В стилях с большим количеством слоёв источники могут использоваться множественными зависимостями.
Типичная структура:
Перед удалением источника выполняется анализ зависимостей:
const layers = map.getStyle().layers;
const dependentLayers = layers.filter(l => l.source === 'cities');
После выявления зависимых слоёв выполняется их последовательное удаление.
Удаление источника освобождает:
При частой смене данных важно избегать избыточных операций удаления/добавления, поскольку это приводит к:
Оптимальная стратегия — переиспользование источников с обновлением
данных через setData или обновление URL для тайловых
источников.
В приложениях с интерактивной картой источники часто удаляются в ответ на события интерфейса:
Пример сценария:
function toggleLayer(enabled) {
if (!enabled) {
if (map.getLayer('heatmap-layer')) {
map.removeLayer('heatmap-layer');
}
if (map.getSource('heatmap')) {
map.removeSource('heatmap');
}
}
}
Корректное управление удалением источников влияет на стабильность состояния стиля. Нарушение порядка операций приводит к:
Стабильная стратегия удаления всегда включает: