Работа с удалением объектов в OpenLayers строится вокруг управления
источниками данных, слоями и вспомогательными сущностями карты.
Архитектура библиотеки предполагает, что геометрические объекты не
существуют изолированно — они всегда привязаны к источникам
(source), слоям (layer) или взаимодействиям
(interaction). Поэтому удаление требует точного понимания
цепочки владения объектом.
Основной способ удаления геометрии в OpenLayers связан с работой
через ol/source/Vector. Векторный источник хранит коллекцию
объектов (Feature), и именно он отвечает за их жизненный
цикл.
Каждый объект Feature может быть удалён напрямую из
источника:
vectorSource.removeFeature(feature);
Удаление происходит по ссылке на объект. Если ссылка утрачена, требуется предварительный поиск через идентификатор:
const feature = vectorSource.getFeatureById('point-1');
vectorSource.removeFeature(feature);
Ключевое поведение:
Полное удаление содержимого источника применяется при массовых операциях:
vectorSource.clear();
Особенности поведения:
Feature без исключения;При необходимости сохранить текущие данные перед очисткой используется копирование массива объектов:
const features = vectorSource.getFeatures();
vectorSource.clear();
В случаях, когда требуется удалить группу объектов по условию, применяется обход коллекции:
vectorSource.getFeatures().forEach(feature => {
if (feature.get('type') === 'temporary') {
vectorSource.removeFeature(feature);
}
});
Важная особенность: при удалении внутри forEach
необходимо учитывать изменение массива. Более стабильный подход —
предварительная фильтрация:
const toRemove = vectorSource.getFeatures().filter(feature =>
feature.get('type') === 'temporary'
);
toRemove.forEach(feature => vectorSource.removeFeature(feature));
Использование id является наиболее устойчивым способом
управления удалением:
vectorSource.removeFeature(vectorSource.getFeatureById(id));
Идентификаторы назначаются вручную:
feature.setId('marker-42');
Преимущество подхода:
Иногда требуется удалить не отдельные объекты, а весь слой:
map.removeLayer(vectorLayer);
Поведение:
Добавление и удаление слоёв часто используется для динамических наборов данных (например, переключение тематических слоёв).
Вместо явного удаления объектов применяется замена источника:
vectorLayer.setSource(new VectorSource());
Такой подход:
Оверлеи (Overlay) представляют всплывающие элементы,
привязанные к координатам карты. Их удаление выполняется отдельно:
map.removeOverlay(overlay);
Особенности:
Некоторые объекты создаются через взаимодействия
(interaction), например рисование или выбор:
map.removeInteraction(drawInteraction);
Удаление взаимодействия приводит к:
При работе с выделением (Select) удаление выбранных
объектов требует доступа к источнику:
selectInteraction.getFeatures().forEach(feature => {
vectorSource.removeFeature(feature);
});
После удаления коллекция выделения может быть очищена:
selectInteraction.getFeatures().clear();
Хотя это не физическое удаление, часто применяется скрытие объектов вместо удаления:
feature.setStyle(null);
Или через условный стиль слоя:
При использовании Cluster источника удаление требует
изменения исходного источника:
clusterSource.getSource().removeFeature(feature);
Важно учитывать:
В некоторых сценариях требуется принудительное обновление состояния слоя после удаления:
vectorLayer.changed();
Или перерисовка карты:
map.render();
Это применяется при сложных кастомных рендерах, где автоматического обновления недостаточно.
Удаление объектов в OpenLayers не всегда означает освобождение памяти:
Feature вне источника сохраняют объект;Корректное освобождение включает:
ol/Collection);OpenLayers активно использует Collection для управления
наборами объектов:
featuresCollection.remove(feature);
или полная очистка:
featuresCollection.clear();
Коллекции часто связаны с:
Удаление из коллекции автоматически синхронизируется с источниками в зависимости от реализации.
При использовании инструмента рисования (Draw)
завершённые объекты могут удаляться сразу после создания:
draw.on('drawend', (event) => {
vectorSource.removeFeature(event.feature);
});
Такой подход используется для: