【问题标题】:Updating feature styles in OpenLayers 3在 OpenLayers 3 中更新特征样式
【发布时间】:2017-02-16 13:23:52
【问题描述】:

我从第 3 方 API 中提取数据,该 API 为我提供了纬度/经度坐标以及该点的状态。我目前能够成功地绘制点并在第一次迭代中为它们的状态提供正确的样式。但是,如果状态发生变化,我需要每 3 秒更新一次他们的样式。我曾尝试使用mySource.changed(),但它不起作用。我环顾四周,找不到解决方案,即使这似乎不应该是一件很难完成的事情?

我还尝试每 3 秒 clear() 我的源,但随后矢量图层“闪烁”,我需要它无缝更新。我还尝试删除/重新添加整个矢量图层。我需要使用样式功能吗?还是功能叠加?为什么我不能像在谷歌地图或传单中那样覆盖样式?

我的风格

var takenStyle = new ol.style.Style({
    image: new ol.style.Icon({
        src: '../_images/redMark.png',
        scale: .2
    })
});
var openStyle = new ol.style.Style({
    image: new ol.style.Icon({
        src: '../_images/greenMark.png',
        scale: .2
    })
});
var unsureStyle = new ol.style.Style({
    image: new ol.style.Icon({
        src: '../_images/yellowMark.png',
        scale: .2
    })
});

我如何分配样式/功能

if ((data.scopes[i].parking_spot.status === true)) {
var feature = new ol.Feature({
  geometry: new ol.geom.Point(ol.proj.transform(pointCoords, 'EPSG:4326', 'EPSG:3857'))
});
feature.setStyle(takenStyle);
feature.setId(i);
pointSource.addFeature(feature);

更新:使用 Navageer Gowda 的建议,我终于能够弄清楚这一点。我创建了第二个函数,并让它遍历功能以更新样式。

if ((data.scopes[i].parking_spot.occupied === true && data.scopes[i].parking_spot.occupied === lastCheck[i].occupied)) {
     theFeatures[i].setStyle(takenStyle);
}

【问题讨论】:

  • 你试过feature.changed()的方法吗? see it
  • 是的,我试过了。似乎什么也没发生。我也尝试在 pointSource 上使用它。但没有运气。我会在我设置样式的 if 语句中调用我的 feature.changed() 吗?
  • 是的,我想是的。你能为我们展示你所有的代码吗?我将创建一个 jsfiddle 并尝试对其进行调试以更好地帮助您。
  • 是的,我将添加我拥有的所有内容。这是相当多的。还值得注意的是,如果我添加 pointSource.clear(),样式将正确更改。但我需要更新才能无缝。

标签: openlayers openlayers-3


【解决方案1】:

要强制每 3 秒刷新一次图层样式,您可以这样做:

window.setInterval(function () {
  layer.getSource().dispatchEvent('change');
}, 3000);

但是,API 通过在 ol.source.Vector 上使用自定义加载器函数和在 ol.layer.Vector 上使用自定义样式函数,以更简洁的方式支持您尝试执行的操作。它看起来像这样:

var layer = new ol.layer.Vector({
  source: new ol.source.Vector({
    loader: function(extent, resolution, projection) {
      var fetchData = function() {
        // Fetch data here, add features *without style* to layer.getSource()
      };

      // Fetch data once immediately
      fetchData();

      // re-fetch every 3 seconds
      window.setInterval(fetchData, 3000);
    }
  }),
  style: function(feature, resolution) {
    var props = feature.getProperties();

    // Psuedo-logic shown here, use your own to determine which style to return
    if (isTaken) {
      return takenStyle;
    } else if (isOpen) {
      return openStyle;
    } else {
      return unsureStyle;
    }
  }
});

【讨论】:

    【解决方案2】:

    每次更改样式时,您似乎又添加了相同的功能。你可以做任何一个

    1. 读取源代码的特征并更改特征的样式或
    2. 在创建新特征并添加到 pointSource 之前执行 source.clear()。(source.clear 删除矢量源中存在的所有特征)

    【讨论】:

    • 我正在添加相同的功能,我只想为它们创建一个功能。如果我改变它,所以我有另一个只更新样式的函数,我会做一个 source.getFeatures([i]).setStyle('whateverstyle') 吗?然后在我的矢量图层上运行刷新?我目前可以通过每三秒在函数开头运行 clear() 来使其工作,但这会导致矢量图层“闪烁”,我需要它是无缝的。
    • 另外,我相信我尝试了 updateParams(),但我认为您不能在矢量图层上使用它。
    • @AustinTruex source.getFeatures([i]).setStyle('whateverstyle')?尝试遍历所有功能并设置样式。它应该工作
    • 您的方法也有效,我接受了 Jeff McCloud 的回答,因为它有效并且提供了一种更清洁的方式来做我想做的事情。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多