Sel ect — механизм взаимодействия в OpenLayers, предназначенный для
выделения пространственных объектов на карте и управления состоянием их
выбора. Реализуется через класс Select, входящий в модуль
ol/interaction/Select. В основе лежит система интеракций
(interactions), которая перехватывает события указателя и преобразует их
в операции над векторными объектами.
Sel ect является специализированной интеракцией, работающей поверх слоя отображения векторных данных. Внутри используется механизм пересечения геометрий (hit detection), основанный на координатах пикселя события и геометриях фич.
Основные компоненты:
interaction.Select — класс взаимодействияFeature — выбираемые объектыCollection — коллекция выбранных элементовCondition — функция условия срабатыванияStyle — визуальное оформление выбранных объектовВзаимодействие интегрируется в карту через метод
map.addInteraction() и начинает перехватывать события
указателя сразу после добавления.
Sel ect работает по следующему принципу:
selectКоллекция выбранных объектов хранится внутри экземпляра
Select и доступна через метод
getFeatures().
import Select fr om 'ol/interaction/Sel ect.js';
const select = new Select();
map.addInteraction(select);
Поведение выбора определяется функцией condition. Она
контролирует, при каком событии происходит выделение.
Наиболее распространённые условия:
import Select fr om 'ol/interaction/Sel ect.js';
import { click } fr om 'ol/events/condition.js';
const sel ect = new Select({
condition: click
});
Условия позволяют формировать различные режимы взаимодействия: от простого выбора до сложных сценариев с комбинированными действиями.
Select поддерживает режим накопления выбранных объектов. При
включении multi или использовании модификаторов клавиатуры
возможно формирование множественного набора.
Типовой сценарий:
import Select fr om 'ol/interaction/Sel ect.js';
import { shiftKeyOnly, click } fr om 'ol/events/condition.js';
const sel ect = new Select({
condition: function (event) {
return click(event) && shiftKeyOnly(event);
}
});
В этом режиме новые объекты добавляются в коллекцию без очистки предыдущих.
Выбранные элементы хранятся в Collection. Для доступа
используется:
const features = select.getFeatures();
Коллекция поддерживает стандартные методы:
push()remove()clear()getLength()Пример обхода выбранных объектов:
features.forEach(function (feature) {
console.log(feature.getId());
});
При изменении выбора генерируется событие select. Оно
содержит информацию о новых и снятых выделениях.
Структура события:
selected — массив добавленных объектовdeselected — массив снятых объектовselect.on('select', function (event) {
const added = event.selected;
const removed = event.deselected;
});
Это позволяет синхронизировать выбор с внешними системами, таблицами атрибутов или интерфейсом управления данными.
Select может быть настроен на работу только с определёнными слоями.
Это реализуется через параметр layers.
const select = new Select({
layers: function (layer) {
return layer.get('selectable') === true;
}
});
Такой подход позволяет исключать базовые слои карты и работать только с интерактивными объектами.
Визуальное представление выбранных объектов задаётся через
style. Возможна передача функции, возвращающей стиль в
зависимости от объекта.
import Style fr om 'ol/style/Style.js';
import Stroke fr om 'ol/style/Stroke.js';
import Fill fr om 'ol/style/Fill.js';
const sel ect = new Sel ect({
style: function () {
return new Style({
stroke: new Stroke({
color: 'blue',
width: 3
}),
fill: new Fill({
color: 'rgba(0, 0, 255, 0.1)'
})
});
}
});
Стиль применяется поверх исходного оформления слоя, не заменяя его полностью, а накладывая визуальное выделение.
Select поддерживает несколько режимов работы:
Каждое новое выделение очищает предыдущий набор.
const select = new Select({
multi: false
});
Новые объекты добавляются в коллекцию без очистки.
const select = new Select({
multi: true
});
Повторный выбор объекта снимает выделение.
Реализуется через кастомную обработку события:
select.on('select', function (event) {
event.deselected.forEach(function (feature) {
select.getFeatures().remove(feature);
});
});
Select может работать в режиме выделения при наведении курсора. Для
этого используется pointermove как условие.
import { pointerMove } fr om 'ol/events/condition.js';
const sel ect = new Select({
condition: pointerMove
});
Такой режим применяется для подсветки объектов без фиксации выбора.
Дополнительная логика отбора объектов реализуется через
filter. Функция проверяет каждый объект перед добавлением в
коллекцию выбора.
const select = new Select({
filter: function (feature, layer) {
return feature.get('type') === 'road';
}
});
Фильтрация позволяет ограничивать выбор по атрибутам, типам геометрии или состоянию слоя.
Select может комбинироваться с интеракцией прямоугольного выделения области.
import DragBox fr om 'ol/interaction/DragBox.js';
import { shiftKeyOnly } fr om 'ol/events/condition.js';
const dragBox = new DragBox({
condition: shiftKeyOnly
});
dragBox.on('boxend', function () {
const extent = dragBox.getGeometry().getExtent();
});
После получения экстента выполняется выбор всех объектов внутри области и добавление их в коллекцию Select.
Сброс состояния выполняется через метод clear():
select.getFeatures().clear();
Очистка сопровождается генерацией события select с
пустым набором выбранных элементов.
Выбранные объекты часто используются для редактирования или
отображения атрибутов. Доступ к данным осуществляется через
getProperties():
select.on('select', function (event) {
event.selected.forEach(function (feature) {
const properties = feature.getProperties();
});
});
Изменение атрибутов может происходить непосредственно после выбора, что делает Select частью цепочки редактирования данных.
При наличии нескольких векторных слоёв выбор может происходить
одновременно на всех слоях, удовлетворяющих условиям layers
и filter. Приоритет определяется порядком рендеринга и
настройками прозрачности hit detection.
Механизм выбора основан на пиксельной проверке:
Это обеспечивает высокую производительность даже при большом количестве объектов.
Select допускает расширение логики через комбинирование условий и событий:
Такие сценарии реализуются через композицию condition,
filter и событий карты.
Коллекция выбранных объектов часто используется как реактивное состояние:
Изменение состояния выбора является центральным событием для интерфейсов, построенных вокруг интерактивной карты.