Modify interaction реализует интерактивное редактирование геометрий на карте: перемещение вершин, добавление новых узлов, удаление точек и корректировку формы объектов. Механизм работает поверх векторного источника данных и напрямую изменяет геометрию feature, синхронно обновляя отображение слоя.
Ключевая особенность взаимодействия заключается в том, что изменение
геометрии происходит в режиме реального времени, без промежуточных шагов
сохранения: объект модифицируется сразу в памяти feature, а
VectorSource автоматически инициирует перерисовку слоя.
Modify interaction строится вокруг трёх основных компонентов:
Feature — объект геометрииVectorSource — источник данныхModify interaction — обработчик пользовательских
действийВзаимодействие происходит по следующей схеме:
Модуль Modify импортируется отдельно:
import Modify from 'ol/interaction/Modify';
import VectorSource from 'ol/source/Vector';
import VectorLayer from 'ol/layer/Vector';
Создание базового слоя:
const source = new VectorSource({
features: []
});
const layer = new VectorLayer({
source: source
});
Добавление взаимодействия редактирования:
const modify = new Modify({
source: source
});
map.addInteraction(modify);
Modify interaction поддерживает два основных режима привязки:
source — редактирование всех объектов источникаfeatures — редактирование конкретного набора
объектовnew Modify({
source: source
});
Редактируются все features, находящиеся в источнике.
new Modify({
features: collection
});
Позволяет ограничить редактирование выбранным набором объектов, что важно для сценариев выделения.
Modify interaction оперирует двумя типами элементов:
При захвате вершины происходит изменение её координат. При работе с сегментами может включаться логика вставки новых точек.
pixelTolerance задаёт допустимую погрешность захвата
вершины в пикселях:
const modify = new Modify({
source: source,
pixelTolerance: 10
});
Большие значения упрощают редактирование на мобильных устройствах, но снижают точность.
Добавление новых узлов контролируется функцией
insertVertexCondition.
import { platformModifierKeyOnly } from 'ol/events/condition';
const modify = new Modify({
source: source,
insertVertexCondition: platformModifierKeyOnly
});
Поведение:
Удаление вершин задаётся отдельным условием:
import { singleClick } from 'ol/events/condition';
const modify = new Modify({
source: source,
deleteCondition: singleClick
});
Чаще используется комбинация с клавишами:
import { platformModifierKeyOnly } from 'ol/events/condition';
deleteCondition: (event) => {
return platformModifierKeyOnly(event) && event.type === 'singleclick';
}
При редактировании полигонов Modify interaction учитывает:
При нарушении топологии (например, самопересечение) поведение зависит от геометрического типа и версии движка геометрии.
Для линейных объектов Modify interaction обеспечивает:
При включённой вставке вершин линии становятся полностью интерактивными по всей длине.
Редактирование можно ограничить набором объектов:
const selected = new Collection();
const modify = new Modify({
features: selected
});
Такой подход используется совместно с Sel ect interaction для сценариев:
Modify interaction генерирует события:
modifystartmodifyendПример обработки:
modify.on('modifystart', (e) => {
console.log('start', e.features);
});
modify.on('modifyend', (e) => {
console.log('end', e.features);
});
Эти события позволяют:
Modify interaction работает в координатах проекции карты. Все изменения происходят в:
При сохранении данных часто требуется:
import { toLonLat } fr om 'ol/proj';
или обратное преобразование перед отправкой на сервер.
Modify interaction часто используется совместно с Snap interaction:
При наличии нескольких объектов:
Редактирование большого количества сложных геометрий приводит к:
Оптимизация достигается через:
features;Взаимодействие можно включать и отключать динамически:
modify.setActive(false);
modify.setActive(true);
Это используется при:
Modify interaction опирается на pointer-события:
Изменение логики возможно через:
Modify и Translate решают разные задачи:
Совместное использование:
import Translate from 'ol/interaction/Translate';
const translate = new Translate({
features: selected
});
map.addInteraction(translate);
map.addInteraction(modify);