OpenLayers 3:缩放/平移后未调用未选定功能的样式函数

时间:2015-11-24 13:03:46

标签: javascript openlayers-3

我为我的问题准备了一个小提琴:Fiddle

  1. 点击蓝色圆圈将其选中 - >它变红了
  2. 点击另一个蓝色圆圈 - >原稿变为蓝色(取消选择),新原稿变为红色(选中)
  3. 到目前为止一切顺利。现在,如果您改为执行以下操作:

    1. 点击蓝色圆圈 - >它变红了
    2. 缩小并返回 - >它保持红色
    3. 点击另一个蓝色圆圈
    4. - > 两个圆圈都是红色而不是取消选择第一个!

      我所拥有的只是一个selectInteractionstyleFunction就像这样(我做了更多的事情,比如文字和缓存样式,但效果是一样的):

      function styleFunction(feature, resolution) {
          var selected = selectInteraction.getFeatures().getArray().indexOf(feature) >= 0;
      
          return [
          new ol.style.Style({
              image: new ol.style.Circle({
                  radius: 30,
                  stroke: new ol.style.Stroke({
                      color: 'blue',
                      width: 1
                  }),
                  fill: new ol.style.Fill({
                      color: selected ? [255, 0, 0, 1] : [0, 0, 255, 1]
                  })
              }),
              text: new ol.style.Text({
                  text: 'Test',
                  fill: new ol.style.Fill({
                      color: 'black'
                  })
              })
          })];
      }
      

      为什么缩放或平移后我的“取消选择”-Style出错了?据我所知,在调试styleFunction时,选择是正确的(只包含1个项目),只是取消选择的项目没有正确设置样式。

      我使用styleFunction因为无论是否选中,我都会根据附加到该要素的对象设置文本和半径。所以我计算了一个特征的样式,并对选定的和未选择的特征使用相同的styleFunction

      编辑:解决方案

      我更新了Fiddle。显然你必须将所有取消选择的特征的样式设置为“null”(参见Jonatas Walker的答案):

      selectInteraction.on('select', function (evt) {
          if (evt) {
              $.each(evt.deselected, function (idx, feature) {
                  feature.setStyle(null);
              });
          }
      });
      

1 个答案:

答案 0 :(得分:0)

更新 - http://jsfiddle.net/jonataswalker/4vu669Lq/

内部styleFunction

var fill_color = (this instanceof ol.Feature) ?
    [0, 0, 255, 1] : [255, 255, 255, 1];

并在select listener上设置所选样式:

selectInteraction.on('select', function(evt){
    var selected = evt.selected;
    var deselected = evt.deselected;
    if (selected.length) {
        selected.forEach(function(feature){
            feature.setStyle(styleFunction);
        });
    }
    if (deselected.length) {
        deselected.forEach(function(feature){
            feature.setStyle(null);
        });
    }
});

这是因为您对styleFunctionol.layer.Vector使用相同的ol.select.Interaction

因此,当您放大/缩小矢量图层时,会从styleFunction中读取样式。