Openlayers - Verlust der Auswahl oder des Stils beim Neuzeichnen von Ebenen

10

Wenn ich die Karte zoome oder verschiebe, wird meine Ebene neu gezeichnet. Dies ist, was ich will, weil ich viele Funktionen gleichzeitig laden muss. Dies ist der 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)
});

Der folgende Code ist mein Auswahlcode. Das alles funktioniert so, wie ich es nicht will. Wenn die Ebene jedoch neu gezeichnet wird, geht die Auswahl verloren und die Funktion onFeatureUnselect wird nicht ausgelöst (was auch immer der Fall sein sollte). Ich bin nicht sicher, ob die Auswahl wirklich verloren geht oder ob der Stil zurückgesetzt wird.

    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

Meine Funktionen onFeatureSelect und 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];
}
Boedy
quelle
Was ist in Ihrer onFeatureSelect-Funktion enthalten?
Geographika
Ich habe meinen Beitrag mit den beiden Funktionen aktualisiert
Boedy

Antworten:

4

Ich habe festgestellt, dass der einfachste Weg, die Vektorauswahl beim Zoomen, Schwenken und Neuzeichnen beizubehalten, darin besteht, Ihrer Karte eine neue leere Vektorebene hinzuzufügen. Wenn Features ausgewählt sind, platzieren Sie eine Kopie in dieser Ebene.

Sie können den ausgewählten Ebenenstil als deutlich sichtbaren Stil festlegen.

Fügen Sie in den Hervorhebungsfunktionen Ihres Auswahlwerkzeugs bei der Auswahl einen Klon des Features hinzu und entfernen Sie ihn, wenn es ein zweites Mal ausgewählt wird.

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

Dies ist leicht vereinfacht (und nicht getestet). Möglicherweise möchten Sie die Auswahlebene als Eigenschaft Ihres Auswahlwerkzeugs speichern.

Überprüfen Sie auch die Funktion getFeatureById. Möglicherweise müssen Sie für Ihre Funktion eine andere eindeutige Eigenschaft als die ID verwenden.

geographika
quelle
Danke für die Antwort. Ich denke, das könnte eine gute Lösung sein. Ich spiele mit Code, stecke aber an dem Punkt fest, an dem das Ereignis onFeatureUnselect nicht ausgelöst wird, wenn die Auswahl verloren geht. Bei welchem ​​Ereignis entferne ich die Feature-Klone? Siehe meinen ursprünglichen Beitrag.
Boedy
@Boedy siehe aktualisierte Antwort. Sie sollten wahrscheinlich alles in der Auswahlfunktion tun. Wählen Sie einmal aus, um auszuwählen, und erneut, um die Auswahl aufzuheben.
Geographika
Danke vielmals! Das Überprüfen, ob sich das Feature in der ausgewählten Ebene befindet, hat geholfen. Jetzt habe ich nur noch ein Styling-Problem, aber ich wette, ich kann das selbst herausfinden.
Boedy
0

Aus meinen Experimenten ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ) geht hervor, dass Auswahl und Stil über einen Zoom beibehalten werden sollten.

Ian Turton
quelle
In deinem Fall funktioniert es. Ihr Code verwendet jedoch nicht: resFactor: 1 und ratio: 1. Dies bewirkt das Neuzeichnen, wenn der Zoom geändert wird. Ihr Beispiel löst kein Neuzeichnen aus.
Boedy
Nun, das schränkt das Problem für Sie dann ein
Ian Turton