OpenLayers 4删除功能。getFeatures()在更改时对数组进行排序

OpenLayers 4删除功能。getFeatures()在更改时对数组进行排序,openlayers,Openlayers,我在我绘制的功能上添加了拖动功能,但是OpenLayers 4似乎在修改功能时,您现在修改的功能的新索引是不同的 如何从核心中删除该功能?或者存在一个替代方案来防止这种情况 这是我用来添加拖动功能的 $("#markdrag").click(function(e) { e.preventDefault(); var sel = document.getElementById('tlfeature'); // get ID of the current marker var i

我在我绘制的功能上添加了拖动功能,但是OpenLayers 4似乎在修改功能时,您现在修改的功能的新索引是不同的

如何从核心中删除该功能?或者存在一个替代方案来防止这种情况

这是我用来添加拖动功能的

$("#markdrag").click(function(e) {

  e.preventDefault();

  var sel = document.getElementById('tlfeature');
  // get ID of the current marker
  var ids = sel[sel.selectedIndex].id;
  var dragInteraction = new ol.interaction.Modify({
    features: new ol.Collection([Msource.getFeatures()[ids]]),
    style: null
  });
});
这里是特征的标记源和图层

Msource = new ol.source.Vector();

markLayer = new ol.layer.Vector({
  source: Msource,
  style: new ol.style.Style({
    image: new ol.style.Icon({
      opacity: 0.95,
      src: 'http://www.traffweb.uk/images/mapplot.svg'
    })
  })
});
这里是我在填充select元素时调用的函数:

function drawingMarker(){

  var id = Msource.getFeatures().length;

  $('<option>', { 'value': id, 'text': 'Marker ' +(id + 1) }).attr('id',
                 id).appendTo('#tlfeature');

  $('<textarea>', { 'name': 'Marker ' +(id + 1), 'rows': '4', 'class': id,
                   'placeholder': "enter text..." }).appendTo('.textDiv');

}
下面是它的屏幕截图


是的,当您更改一个功能时,它的索引将始终位于getFeatures()结果的最后一个。这是openlayers中的操作机制

参见API:它使用随机顺序

不管怎样,我想出了一个办法,不是最好的,但可以帮你的忙。使用id跟踪标记。就像:

var len = vector.getSource().getFeatures().length;
var feature = new ol.Feature({
    geometry: new ol.geom.Point(coordinate),
    image: 'img/mark_b.png',
    id: len
});
vector.getSource().addFeature(feature);
并通过
vector.getSource().getFeatureById()获取它。
按以下方式修改您的代码:

$("#markdrag").click(function(e) {

  e.preventDefault();

  var sel = document.getElementById('tlfeature');
  // get ID of the current marker
  var ids = sel[sel.selectedIndex].id;
  var dragInteraction = new ol.interaction.Modify({
    features: new ol.Collection([Msource.getFeatureById(ids)]),
    style: null
  });
});

感谢您的回答,我正在考虑类似您的解决方案,但我不知道如何在我的代码中实现它,我更新我的问题是为了向您展示我如何填充和创建功能。@Sebastiano根据我的理解,您的代码实现了在地图上单击以添加标记,选择下拉项可一次性修改某些功能。删除功能后删除相关项。这是真的吗?@Sebastiano我想你最好给标记的id分配一个静态计数器。因为删除特征会改变
getFeatures()
结果的长度,这将等于创建的某个特征。是的,我有3个按钮(标记只有1个)当我点击它们时,我会激活绘图功能,并在你用鼠标点击地图时开始绘图。完成绘图后,我将填充选择元素。现在我可以选择我想要的,并定位、拖动或删除它(我可以取消设置而不是删除)。问题是我不能将
featurebyId
添加到我的代码
Msource.getFeatures()[Msource.getFeatures().length-1].setId(Msource.getFeatures().length-1)
当您完成填充
select元素时,然后
Msource.getFeatureById(ids)
但是如果我使用它来获得ID,它将返回我
null
,它将工作
markLayer.getSource().getFeatures()[0]。getId()
但我需要迭代源代码并获得正确的
ID
而不是选择一个并获取
ID
$("#markdrag").click(function(e) {

  e.preventDefault();

  var sel = document.getElementById('tlfeature');
  // get ID of the current marker
  var ids = sel[sel.selectedIndex].id;
  var dragInteraction = new ol.interaction.Modify({
    features: new ol.Collection([Msource.getFeatureById(ids)]),
    style: null
  });
});