Работа с объектами в Mapbox GL JS строится вокруг строгой иерархии: карта → источники (sources) → слои (layers) → визуальные сущности (markers, popups, images). Удаление элементов требует соблюдения этой структуры, поскольку зависимости между компонентами жёстко связаны.
Ключевое правило управления состоянием карты:
Сначала удаляются слои, затем источники данных.
Нарушение порядка приводит к ошибкам вида
Source cannot be removed while layer is using it.
Слои отвечают за визуализацию данных. Удаление слоя не затрагивает источник данных, но освобождает рендеринг.
map.removeLayer('layer-id');
if (map.getLayer('layer-id')) {
map.removeLayer('layer-id');
}
Источники данных являются фундаментом визуализации. Они могут быть GeoJSON, vector tiles, raster tiles и др.
map.removeSource('source-id');
Источник нельзя удалить, если он используется хотя бы одним слоем.
Правильная последовательность:
if (map.getLayer('layer-id')) {
map.removeLayer('layer-id');
}
if (map.getSource('source-id')) {
map.removeSource('source-id');
}
Попытка удаления источника до слоя вызывает исключение:
The source "source-id" cannot be removed while layer "layer-id" is using it
Маркер представляет собой DOM-элемент, независимый от стилей карты.
marker.remove();
При работе с множественными маркерами требуется явное хранение ссылок:
markers.forEach(marker => marker.remove());
markers = [];
Popups также являются DOM-объектами, привязанными к карте.
popup.remove();
GeoJSON-источники не позволяют удалять отдельные features напрямую. Вместо этого применяется перезапись данных.
const source = map.getSource('geojson-source');
source.setData({
type: 'FeatureCollection',
features: []
});
const updated = geojson.features.filter(f => f.id !== targetId);
map.getSource('geojson-source').setData({
type: 'FeatureCollection',
features: updated
});
GeoJSON-источник всегда перерисовывается целиком, что делает его удаление логически равным замене состояния.
Добавленные изображения можно удалить из стиля карты:
map.removeImage('image-id');
symbol;События, привязанные к карте, могут сохраняться даже после удаления визуальных элементов.
map.off('click', 'layer-id', handler);
map.off('mousemove', handler);
Утечка памяти возникает при отсутствии явного удаления обработчиков, особенно при динамической перерисовке слоёв.
Полный цикл удаления связанного набора объектов:
if (map.getLayer('layer-id')) {
map.removeLayer('layer-id');
}
if (map.getSource('source-id')) {
map.removeSource('source-id');
}
if (map.hasImage('image-id')) {
map.removeImage('image-id');
}
Удаление всей карты освобождает все ресурсы WebGL и DOM.
map.remove();
После вызова map.remove() любые обращения к объекту
карты становятся недопустимыми и приводят к ошибкам выполнения.
При частой перерисовке интерфейса используется стратегия “создать → обновить → удалить”.
if (map.getLayer('temp-layer')) {
map.removeLayer('temp-layer');
}
if (map.getSource('temp-source')) {
map.removeSource('temp-source');
}
map.addSource('temp-source', {
type: 'geojson',
data: geojsonData
});
map.addLayer({
id: 'temp-layer',
type: 'circle',
source: 'temp-source'
});
Каждое обновление рассматривается как полная замена состояния, а не частичная модификация структуры.
map.removeLayer('raster-layer');
map.removeSource('raster-source');
Feature-state не удаляется автоматически при удалении слоя.
map.setFeatureState(
{ source: 'source-id', id: featureId },
{}
);
Для очистки состояния используется перезапись или удаление source.
getLayer и getSource;