Openlayers - Perdre la sélection ou le style lors du redessin du calque


10

Lorsque je fais un zoom ou que je déplace la carte, ma couche est redessinée. C'est ce que je veux, car j'ai beaucoup de fonctionnalités à charger en même temps. Voici le code:

    wfs = new OpenLayers.Layer.Vector("WFS", {
    strategies: [new OpenLayers.Strategy.BBOX({
                    resFactor: 1,
                    ratio:1
                })],
    protocol: new OpenLayers.Protocol.WFS({
              maxFeatures:1000,
              url:  myUrl,
              featureType: myFeatureType,
              featureNS: myFeaturedNS,
              version: "1.1.0"
              }),
      filter: setFilter(year, variant)
});

Le code suivant est mon code de sélection. Tout cela fonctionne comme je ne le veux pas. Cependant, lorsque le calque est redessiné, la sélection est perdue et le onFeatureUnselect n'est pas déclenché (ce qu'il devrait). Je ne sais pas si la sélection est vraiment perdue ou si le style est réinitialisé.

    selectCtrl = new OpenLayers.Control.SelectFeature(
        wfs,
        {
            clickout: true, toggle: false,
            multiple: false, hover: false,
            box: true,
            toggleKey: "shiftKey", // ctrl key removes from selection
            multipleKey: "shiftKey",
            eventListeners: {
                featurehighlighted: onFeatureSelect,
                featureunhighlighted: onFeatureUnselect

            }
        }
    );

@geographika

Mes fonctions onFeatureSelect et onFeatureUnselect:

function onFeatureSelect(e) {
var feature = e.feature.attributes;
var featureclone = e.feature.clone();

var style = {
    pointRadius: 10,
    fillOpacity:0,
    strokeColor: "#000000"
    };

featureclone.style = style;

layer2.addFeatures([featureclone]);
selectedFeatures[featureclone.attributes.receptor_id] = featureclone;
}

function onFeatureUnselect(e) {
    var feature = e.feature.attributes;
    layer2.removeFeatures(selectedFeatures[feature.receptor_id]);   
    delete selectedFeatures[feature.receptor_id];
}

Que contient votre fonction onFeatureSelect?
geographika

J'ai mis à jour mon message avec les deux fonctions
Boedy

Réponses:


4

J'ai trouvé que le moyen le plus simple de conserver les sélections vectorielles pour le zoom, le panoramique et les retraits consiste à ajouter une nouvelle couche vectorielle vide à votre carte, et lorsque les entités sont sélectionnées, placez une copie dans cette couche.

Vous pouvez définir le style de calque sélectionné comme un style clairement visible.

Dans les fonctions de mise en surbrillance de votre outil de sélection, ajoutez un clone de la fonction lors de la sélection et supprimez-la lorsqu'elle est sélectionnée une deuxième fois.

onFeatureSelect(feat){
  //check if the feature is in the select layer
  var cloned_feat = selectionLayer.getFeatureById(feat.id); 
  //or a getFeatureBy with a unique property

  if(cloned_feat){
      selectionLayer.removeFeatures([cloned_feat]);
  }
  else {
      var featCopy = feat.clone();
      this.sketchLayer.addFeatures([featCopy]);
  }
}

Ceci est légèrement simplifié (et non testé) - vous souhaiterez probablement stocker la couche de sélection en tant que propriété de votre outil de sélection.

Vérifiez également la fonction getFeatureById - vous devrez peut-être utiliser une propriété unique différente sur votre fonctionnalité plutôt que l'ID.


Merci pour la réponse. Je pense que cela pourrait être une bonne solution. Je joue avec du code, mais je suis bloqué au point que l'événement onFeatureUnselect ne se déclenche pas lorsque la sélection est perdue. Alors, à quel événement dois-je supprimer les clones de fonctionnalités? Voir mon message d'origine.
Boedy

@Boedy voir la réponse mise à jour. Vous devriez probablement tout faire dans la fonction de sélection. Sélectionnez une fois pour sélectionner, puis à nouveau pour désélectionner.
geographika

Merci beaucoup! Cheching si l'entité est dans la couche sélectionnée a aidé. Maintenant, j'ai juste un problème de style, mais je parie que je peux le résoudre moi-même.
Boedy

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.