Openlayers - Tracenie zaznaczenia lub stylu podczas przerysowywania warstwy


10

Kiedy powiększam lub przesuwam mapę, moja warstwa jest przerysowana. Właśnie tego chcę, ponieważ mam wiele funkcji do załadowania na raz. To jest kod:

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

Poniższy kod jest moim kodem wyboru. To wszystko działa tak, jak ja tego nie chcę. Jednak po przerysowaniu warstwy wybór zostanie utracony, a funkcja onFeatureUnselect nie zostanie uruchomiona (co powinno). Nie jestem pewien, czy wybór został naprawdę utracony lub czy styl został zresetowany.

    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

Moje funkcje onFeatureSelect i 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];
}

Co zawiera funkcja onFeatureSelect?
geographika,

Zaktualizowałem swój post o dwie funkcje
Boedy

Odpowiedzi:


4

Znalazłem najłatwiejszy sposób na utrzymanie zaznaczenia wektora podczas powiększania, przesuwania i przerysowywania, dodając do mapy nową pustą warstwę wektorową, a po wybraniu obiektów umieść kopię na tej warstwie.

Możesz ustawić styl wybranej warstwy, aby był wyraźnie widoczny.

W funkcjach podświetlania wybranego narzędzia dodaj klon funkcji podczas wybierania i usuń ją, gdy zostanie wybrana po raz drugi.

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

Jest to nieco uproszczone (i niesprawdzone) - prawdopodobnie będziesz chciał zapisać warstwę wyboru jako właściwość wybranego narzędzia.

Sprawdź także funkcję getFeatureById - być może będziesz musiał użyć innej unikalnej właściwości na swojej funkcji niż ID.


Dziękuję za odpowiedź. Myślę, że to może być dobre rozwiązanie. Mam problemy z kodem, ale utknąłem w punkcie, w którym zdarzenie onFeatureUnselect nie uruchamia się po utracie wyboru. Więc na jakim wydarzeniu usunę klony funkcji? Zobacz mój oryginalny post.
Boedy

@ Booedy patrz zaktualizowana odpowiedź. Prawdopodobnie powinieneś zrobić wszystko w funkcji wyboru. Wybierz raz, aby wybrać, a następnie ponownie, aby odznaczyć.
geografia

Wielkie dzięki! Pomogło sprawdzanie, czy obiekt znajduje się na wybranej warstwie. Teraz mam tylko problem ze stylizacją, ale założę się, że sam mogę to rozwiązać.
Boedy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.