绘制后将样式附加到特征

Attaching style to feature after drawing

我正在使用 ol.Interaction.Draw 在地图上绘制多边形。我想在绘制后对各个特征进行样式设置。

当我检测到 DRAWEND 事件时,我尝试将样式附加到最后绘制的要素,但只有一般图层样式出现在屏幕上,尽管我在通过调试器。

map.addInteraction( drawInter = new ol.interaction.Draw({           
                features: drawLayer.getFeatures(),                      
                type: "Polygon" 
                })                                                  
            );

drawInter.on('drawend', function(e) {                           
    var style = new ol.style.Style({                                    
        fill: new ol.style.Fill({ color: newColor })
        });

    var features = drawLayer.getFeatures().getArray();                  
    var last = features.length-1;
    features[last].setStyle(style); 
});

您调用 setStyle 的地图项不是刚刚绘制的地图项。这就是为什么刚刚绘制的特征没有预期的样式。 (考虑到您的代码,我真的很惊讶该功能在绘图完成后仍然存在于地图上。)

您的代码在多个方面是 incorrect/strange:

  • 阅读您的代码听起来您认为每次调用向量层 returns 上的 getFeatures 同一个数组。事实并非如此。每次调用 getFeatures 实际上 returns 一个新数组。

  • 您将特征数组传递给 Draw 交互(通过 features 选项)。这是不正确的。 features 选项应该是 ol.Collection.

  • drawend 回调中,事件对象(代码中的 e)包含对绘制要素 (e.feature) 的引用。

所以,如果你想将绘制的特征持久化到一个矢量图层中,你可以使用以下方法:

var draw = new ol.interaction.Draw({
  type: 'Polygon',
  source: drawLayer.getSource()
});

draw.on('drawend', function(e) {
  var style = new ol.style.Style({
    // ...
  });
  e.feature.setStyle(style);
});

map.addInteraction(draw);