Мне нужно определить, когда вершина была добавлена в линию во время ее рисования или редактирования.То, как я это делаю сейчас, работает, но кажется довольно неуклюжим, поэтому мне интересно, пропускаю ли я «наблюдаемое» событие или есть более элегантный способ перехвата новых вершин.
Что яСейчас я делаю добавление моего собственного свойства к функции, которая отслеживает, сколько было вершин, и затем проверяет его по фактическому количеству вершин в каждом событии 'изменения', в основном:
draw.on('drawstart',
function(evt) {
var sketch = evt.feature;
var sketchGeom = sketch.getGeometry();
// the 'change' event will will fired by mouse move or mouse click
sketchGeom.on('change', function(evt) {
// check the actual number of verticies against
// my 'nodeCount' to see if the 'change' event
// has created a vertex
});
sketchGeom.set('nodeCount', 1); // add my own property to track the number of verticies
},
this);
Другой подход, который я видел, это отслеживать клики по карте, а не следить за изменениями в функции, но это не вписывается в мой поток, а также наблюдать за событием «изменение».
Так что естьсобытие 'vertexAdded' или что-то подобное, что я пропустил?
РЕДАКТИРОВАТЬ: Основываясь на предложении Майка, я изменил свой код несколько ниже, он по-прежнему кажется грязным.Я добавляю свое собственное свойство 'nodeCount' к геометрии, которое я увеличиваю при щелчках мышью.Затем я могу проверить свое свойство 'nodeCount' по фактической длине геометрии.Если OL добавил вершину из-за перемещения мыши, тогда длина геометрии будет больше, чем мой счет, и я знаю, что имею дело с перемещением мыши, в противном случае они равны, и я знаю, что имею дело с щелчком.
var draw = new Draw({ // import Draw from 'ol/interaction/Draw.js';
source: source,
type: 'LineString',
condition: function(evt) {
var res = noModifierKeys(evt); // import {noModifierKeys} from 'ol/events/condition.js';
var features = draw.getOverlay().getSource().getFeatures();
if (res && features.length) {
let geom = features[0].getGeometry();
geom.set('nodeCount', geom.getCoordinates().length); // add my own property
}
return res;
}
});
draw.on('drawstart',
function(evt) {
var sketchGeom = evt.feature.getGeometry();
// the 'change' event will be fired by mouse-move or mouse-click
sketchGeom.on('change', function(evt) {
let geom = evt.target;
let verticesLength = geom.getCoordinates().length;
let nodeCount = geom.get('nodeCount') // fetch my property
if (verticesLength === nodeCount) { // a new vertex has been created by a mouse click
// handle a mouse-click
} else if (verticesLength > nodeCount) { // a new vertex has been created by mouse move (not by a click, which would have incremented nodeCount)
// handle a mouse-move
}
// do things that are common to mouse-move and mouse-click
});
},
this);