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

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.