【问题标题】:Attaching style to feature after drawing绘制后将样式附加到特征
【发布时间】:2015-01-03 15:31:11
【问题描述】:

我正在使用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); 
});

【问题讨论】:

    标签: openlayers-3


    【解决方案1】:

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

    您的代码在多个方面不正确/奇怪:

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

    • 您将一组特征传递给 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);
    

    【讨论】:

    • 我正在处理网站上的Draw and modify features example,并像这样定义了我的层:drawLayer=new ol.FeatureOverlay({ source: new ol.source.Vector() } );,这使用'source: drawLayer.getSource() 方法会产生错误。
    • 更新: 我将 drawlayer 初始化更改为:drawLayer=new ol.layer.Vector({ source: new ol.source.Vector() }); map.addLayer(this.drawLayer),我现在可以设置该功能的样式,但是当我添加 modifyInteraction:map.addInteraction( this.modifyInter=new ol.interaction.Modify({y source: drawLayer.getSource() 时,我会收到错误此代码已加载:Uncaught TypeError: Cannot read property 'forEach' of undefined at ol-debug.js:90285
    • 这是一个不同的问题。 Modify 交互需要ol.Collection,通过features 选项指定。此集合包括修改的候选对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多