Javascript OpenLayers destroyFeatures()不';使用群集策略时不要破坏功能

Javascript OpenLayers destroyFeatures()不';使用群集策略时不要破坏功能,javascript,openlayers,Javascript,Openlayers,与中描述的问题类似 在向量层上调用destroyFeatures()或removeAllFeatures()。这些特征从视图中消失。然后放大或缩小,它们就会重新出现。对我来说,这只有在使用集群策略时才会发生。看起来好像群集功能已被破坏,但该群集所代表的基础功能未被破坏,因此,当您放大或缩小时,将根据这些基础功能重新计算群集并重新绘制 谷歌搜索揭示了几年前OpenLayers开发者之间关于destroyFeatures()问题的一些对话。令人惊讶的是,即使是现在,这些问题似乎还没有完全解决 我可以

与中描述的问题类似

在向量层上调用destroyFeatures()或removeAllFeatures()。这些特征从视图中消失。然后放大或缩小,它们就会重新出现。对我来说,这只有在使用集群策略时才会发生。看起来好像群集功能已被破坏,但该群集所代表的基础功能未被破坏,因此,当您放大或缩小时,将根据这些基础功能重新计算群集并重新绘制

谷歌搜索揭示了几年前OpenLayers开发者之间关于destroyFeatures()问题的一些对话。令人惊讶的是,即使是现在,这些问题似乎还没有完全解决

我可以通过销毁整个层(使用destroy())然后在需要时重新创建它来解决这个问题。在我的例子中,这没关系,但我可以想象这样一种错误的方法可能不可取的情况

作为对代码示例请求的响应,这里是正在运行的版本中代码的缩写版本(即,使用destroy()。在非工作版本中,我调用了destroyFeatures()(并没有将层设置为null)。如上所述,这将在一开始删除这些功能,但如果我随后使用此.map.zoomIn()放大或缩小,这些功能将重新出现

注1:这些函数是通过JavaScript桥从Objective-C调用的。 注2:JavaScript是使用CoffeeScript生成的

(function() {
  var addSightingsLayer, displayFeaturesForSightingsWithGeoJSONData, geoJSONFormat, load, map, projectionSphericalMercator, projectionWGS84, removeSightingsLayer, sightingsLayer;

  addSightingsLayer = function() {
    var context, layerStyle, layerStyleSelected, style, styleMap, styleSelected, yerClusteringStrategy;
    if (!(this.sightingsLayer === null)) return;
    yerClusteringStrategy = new OpenLayers.Strategy.Cluster({
      distance: 10,
      threshold: 2
    });
    this.sightingsLayer = new OpenLayers.Layer.Vector('Sightings', {
      strategies: [yerClusteringStrategy]
    });
    this.map.addLayer(this.sightingsLayer);
    style = {
      // Here I define a style
    };
    context = {
    // Here I define a context, with several functions depending on whether there is a cluster or not, eg:
      dependentLabel: function(feature) {
        if (feature.cluster) {
          return feature.attributes.count;
        } else {
          return feature.attributes.name;
        }
      }, ....

    };
    layerStyle = new OpenLayers.Style(style, {
      context: context
    });
    styleSelected = {
      //...
    };
    layerStyleSelected = new OpenLayers.Style(styleSelected, {
      context: context
    });
    styleMap = new OpenLayers.StyleMap({
      'default': layerStyle,
      'select': layerStyleSelected
    });
    this.sightingsLayer.styleMap = styleMap;
  };

  removeSightingsLayer = function() {
    if (this.sightingsLayer === null) return;
    this.sightingsLayer.destroy();
    return this.sightingsLayer = null;
  };

  displayFeaturesForSightingsWithGeoJSONData = function(geoJSONData) {
    if (this.sightingsLayer === null) JFOLMap.addSightingsLayer();
    return this.sightingsLayer.addFeatures(this.geoJSONFormat.read(geoJSONData));
  };

  load = function() {
    var lat, lon, osmLayer, zoom;
    lat = ...;
    lon = ...;
    zoom = ...;
    this.map = new OpenLayers.Map('mapDiv', {
      controls: ...,
      eventListeners: ...
    });
    osmLayer = new OpenLayers.Layer.OSM();
    this.map.addLayer(osmLayer);
    return this.map.setCenter(new OpenLayers.LonLat(lon,     lat).transformWGS84ToSphericalMercator(), zoom);
  };

  OpenLayers.LonLat.prototype.transformWGS84ToSphericalMercator = function() {
    return this.transform(JFOLMap.projectionWGS84, JFOLMap.projectionSphericalMercator);
  };

  OpenLayers.LonLat.prototype.transformSphericalMercatorToWGS84 = function() {
    return this.transform(JFOLMap.projectionSphericalMercator, JFOLMap.projectionWGS84);
  };

  map = null;
  sightingsLayer = null;
  sightingsPopoverControl = null;
  projectionWGS84 = new OpenLayers.Projection('EPSG:4326');
  projectionSphericalMercator = new OpenLayers.Projection('EPSG:900913');
  geoJSONFormat = new OpenLayers.Format.GeoJSON({
    'externalProjection': projectionWGS84,
    'internalProjection': projectionSphericalMercator
  });

  this.JFOLMap = {
    map: map,
    sightingsLayer: sightingsLayer,
    projectionSphericalMercator: projectionSphericalMercator,
    projectionWGS84: projectionWGS84,
    geoJSONFormat: geoJSONFormat,
    load: load,
    addSightingsLayer: addSightingsLayer,
    removeSightingsLayer: removeSightingsLayer,
    displayFeaturesForSightingsWithGeoJSONData: displayFeaturesForSightingsWithGeoJSONData,
  };

}).call(this);

试试这个,它对我有用

layer.removeAllFeatures();
layer.destroyFeatures();//optional
layer.addFeatures([]);

你有代码示例吗?我使用群集策略,在web应用生命周期中多次调用这些功能,没有问题。谢谢,Jeff。我已经在上面添加了代码。还有一个问题,如果进行自定义构建,您将使用什么版本的OL和什么配置?请注意,集群确实有一个功能缓存,我看到有几个版本没有正确地刷新它。您可能想要抛出一个调试器;命令,以确保它正在刷新功能缓存。我使用的是v2.12,谢天谢地,它解决了当视口大小更改时,平铺无法正确重画的另一个问题。这是完整的预建缩小版。我只是编辑了一行来添加一些额外的特征形状。感谢clearCache()提示;我来看看。其他的都很标准。您最好的选择是调试clearCache()函数,特别是您应该看看这个.features数组。这就是为策略存储功能的地方…当您销毁features()时,它们应该设置为null。有趣的想法是,添加一个空数组以确保旧数组真的消失了。我会试试看。谢谢