OpenLayers 4删除功能。getFeatures()在更改时对数组进行排序
我在我绘制的功能上添加了拖动功能,但是OpenLayers 4似乎在修改功能时,您现在修改的功能的新索引是不同的 如何从核心中删除该功能?或者存在一个替代方案来防止这种情况 这是我用来添加拖动功能的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
$("#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
});
});