Openlayer: perdita di selezione o stile sul ridisegno dei livelli


10

Quando ingrandisco o sposto la mappa, il mio livello viene ridisegnato. Questo è quello che voglio, perché ho molte caratteristiche da caricare in una sola volta. Questo è il codice:

    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)
});

Il seguente codice è il mio codice di selezione. Tutto funziona come non volevo. Tuttavia, quando il layer viene ridisegnato, la selezione viene persa e onFeatureUnselect non viene attivato (cosa che dovrebbe). Non sono sicuro che la selezione sia davvero persa o che lo stile sia ripristinato.

    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

Le mie funzioni onFeatureSelect e 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];
}

Cosa c'è nella tua funzione onFeatureSelect?
geographika,

Ho aggiornato il mio post con le due funzioni
Boedy,

Risposte:


4

Ho trovato il modo più semplice per mantenere le selezioni vettoriali attraverso zoom, panning e ridisegni è quello di aggiungere un nuovo livello vettoriale vuoto alla tua mappa e quando le caratteristiche sono selezionate posiziona una copia in questo livello.

È possibile impostare lo stile del livello selezionato in modo che sia chiaramente visibile.

Nelle funzioni di evidenziazione dello strumento di selezione, aggiungi un clone della funzione durante la selezione e rimuovilo quando viene selezionato una seconda volta.

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]);
  }
}

Questo è leggermente semplificato (e non testato): probabilmente vorrai archiviare il livello di selezione come proprietà del tuo strumento di selezione.

Controlla anche la funzione getFeatureById: potrebbe essere necessario utilizzare una proprietà univoca diversa sulla tua funzione anziché l'ID.


Grazie per la risposta. Penso che questa potrebbe essere una buona soluzione. Sto scherzando con un po 'di codice, ma sono bloccato al punto in cui l'evento onFeatureUnselect non si attiva quando la selezione viene persa. Quindi in quale evento rimuovo i cloni delle funzionalità? Vedi il mio post originale.
Boedy,

@Boedy vedi risposta aggiornata. Probabilmente dovresti fare tutto nella funzione select. Selezionare una volta per selezionare e di nuovo per deselezionare.
geographika,

Grazie molto! Cheching ha aiutato se la funzione è nel livello selezionato. Ora ho solo un problema di stile, ma scommetto che posso capirlo da solo.
Boedy,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.