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

Работа с удалением объектов в 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);

Особенности:

  • оверлей исчезает с карты немедленно;
  • DOM-элемент может оставаться в памяти, если используется повторно;
  • повторное добавление возможно без пересоздания объекта.

Управление взаимодействиями при удалении

Некоторые объекты создаются через взаимодействия (interaction), например рисование или выбор:

map.removeInteraction(drawInteraction);

Удаление взаимодействия приводит к:

  • прекращению генерации новых объектов;
  • остановке событий рисования или выделения;
  • освобождению обработчиков событий.

Удаление объектов в Select-интеракции

При работе с выделением (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();

Коллекции часто связаны с:

  • Select-интеракциями;
  • Translate/Modify взаимодействиями;
  • пользовательскими наборами объектов.

Удаление из коллекции автоматически синхронизируется с источниками в зависимости от реализации.


Удаление при работе с рисованием

При использовании инструмента рисования (Draw) завершённые объекты могут удаляться сразу после создания:

draw.on('drawend', (event) => {
  vectorSource.removeFeature(event.feature);
});

Такой подход используется для:

  • временных измерений;
  • вспомогательных геометрий;
  • динамических построений.