Events OpenLayers 3如何将功能修改事件注册为;“功能已修改”;在OpenLayer 2中

Events OpenLayers 3如何将功能修改事件注册为;“功能已修改”;在OpenLayer 2中,events,observable,interaction,undo-redo,openlayers-3,Events,Observable,Interaction,Undo Redo,Openlayers 3,我需要使用OpenLayers 3矢量编辑来实现Undo/Redo功能(就像OpenLayers 2中演示的那样) 为了跟踪特征的几何变化,我必须管理一个内存堆栈,它将在用户交互时保存特征的几何变化定义。我知道OpenLayers 3提供了可观察的对象。因此,可以观察到ol.Feature或ol.Feature.getGeometry()的更改,但我正在寻找ol.interaction.Modify发出的显式事件,该事件应在交互开始或结束向量编辑操作时通知我(就像“beforefeaturemo

我需要使用OpenLayers 3矢量编辑来实现Undo/Redo功能(就像OpenLayers 2中演示的那样)

为了跟踪特征的几何变化,我必须管理一个内存堆栈,它将在用户交互时保存特征的几何变化定义。我知道OpenLayers 3提供了可观察的对象。因此,可以观察到
ol.Feature
ol.Feature.getGeometry()
的更改,但我正在寻找
ol.interaction.Modify
发出的显式事件,该事件应在交互开始或结束向量编辑操作时通知我(就像
“beforefeaturemodified”
“featuremodified”
OpenLayers 2中的事件)

监听观察到的几何体或特征变化的处理程序可用于此目的,但成本太高,因为被修改特征的几何体随每个像素的移动而变化


我已经浏览了OpenLayers 3的官方网站,但是找不到OpenLayers 2提供的各种事件。在大多数情况下,文档仅提及变更事件。我想知道这样的事件是否不是Openlayer 3架构的考虑因素。如果是这样,有什么建议吗?我如何扩展现有的
ol.interaction.Modify
以合并自定义事件?谢谢。

从OpenLayers 3.7.0开始,ol.interaction.Modify发出
modifystart
modifyend
。文件:

在每次修改后随机决定是保留还是反转的示例():


请注意,事件是在每次交互之前和之后发出的。拖动一个顶点,然后单击一个顶点将其删除(两者位于同一功能上),将触发两个
modifystart
modifyend
事件。

当前没有此类事件。所以我建议在OL3GitHub中为此创建问题。OL2和ol3都是开源的。你看过源代码了吗?我通过复制函数并根据自己的目的修改它们,找到了解决OL3中特定问题的方法。谢谢@erilem和@anders finn。我已经在上创建了这个问题,并且成功地继承了
ol.interaction.Modify
,使用
goog.EventTarget
等将必要的事件合并到一起。我们公司正在寻找两个答案,以决定是否在即将到来的项目中使用openlayers-3。1-根据OL3的未来更新,通过使用
goog.base
goog.inherits
扩展
ol
类来实现自定义行为是否安全?2-如果这些扩展与商业产品一起提供,是否会存在许可冲突?谢谢。我很难确定这一点,但我认为我目前观察到原始坐标包含对。。。原始坐标,当到达
删除原始坐标[feature]时,使其消失(特征随后也消失)。不删除的效果和预期的一样,但我不知道这是否会产生非常坏的影响™ 关于内存使用。
var select = new ol.interaction.Select({
    style: overlayStyle
});

// The modify interaction does not listen to geometry change events.
// Changing the feature coordinates will make the modify interaction
// unaware of the actual feature coordinates.
// A possible fix: Maintain a collection used by Modify, so we can reload
// the features manually. This collection will always contain the same
// features as the select interaction.
var selectSource = new ol.Collection();
select.on('select', function (evt) {
    evt.selected.forEach(function (feature) {
        selectSource.push(feature);
    });
    evt.deselected.forEach(function (feature) {
        selectSource.remove(feature);
    });
});

var modify = new ol.interaction.Modify({
    features: selectSource, // use our custom collection
    style: overlayStyle
});

var map = new ol.Map({
    interactions: ol.interaction.defaults().extend([select, modify]),
    layers: [layer],
    target: 'map',
    view: new ol.View({
        center: [0, 1000000],
        zoom: 2
    })
});

var originalCoordinates = {};
modify.on('modifystart', function (evt) {
    evt.features.forEach(function (feature) {
        originalCoordinates[feature] = feature.getGeometry().getCoordinates();
    });
});
modify.on('modifyend', function (evt) {
    evt.features.forEach(function (feature) {
        if (feature in originalCoordinates && Math.random() > 0.5) {
            feature.getGeometry().setCoordinates(
                originalCoordinates[feature]
            );
            delete originalCoordinates[feature];

            // remove and re-add the feature to make Modify reload it's geometry
            selectSource.remove(feature);
            selectSource.push(feature);
        }
    });
})