Openlayers - perdendo a seleção ou o estilo no redesenho da camada

10

Quando amplio ou movo o mapa, minha camada é redesenhada. É isso que eu quero, porque tenho muitos recursos para carregar de uma só vez. Este é o código:

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

O código a seguir é o meu código de seleção. Isso tudo funciona como eu não quero. No entanto, quando a camada é redesenhada, a seleção é perdida e o onFeatureUnselect não é acionado (o que deveria). Não tenho certeza se a seleção está realmente perdida ou se o estilo foi redefinido.

    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

Minhas funções 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];
}
Boedy
fonte
O que há na sua função onFeatureSelect?
geographika
Eu atualizei meu post com as duas funções
Boedy

Respostas:

4

Eu descobri que a maneira mais fácil de manter as seleções de vetor através de zoom, pan e redesenho é adicionar uma nova camada de vetor vazia ao seu mapa e, quando os recursos forem selecionados, faça uma cópia nessa camada.

Você pode definir o estilo de camada selecionado para ser um estilo claramente visível.

Nas funções de destaque da ferramenta de seleção, adicione um clone do recurso ao selecionar e remova-o quando ele for selecionado uma segunda vez.

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

Isso é um pouco simplificado (e não testado) - você provavelmente desejará armazenar a camada de seleção como uma propriedade da sua ferramenta de seleção.

Verifique também a função getFeatureById - pode ser necessário usar uma propriedade exclusiva diferente no seu recurso, em vez do ID.

geographika
fonte
Obrigado pela resposta. Eu acho que isso pode ser uma boa solução. Estou brincando com algum código, mas estou preso no ponto em que o evento onFeatureUnselect não é acionado quando a seleção é perdida. Então, em qual evento eu removo os clones de recursos? Veja minha postagem original.
Boedy
@Boedy, veja a resposta atualizada. Você provavelmente deve fazer tudo na função de seleção. Selecione uma vez para selecionar e novamente para desmarcar.
geographika
Muito Obrigado! Verificar se o recurso está na camada selecionada ajudou. Agora só tenho um problema de estilo, mas aposto que posso descobrir isso sozinho.
Boedy 24/10/11
0

Pelas minhas experiências ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ), parece que a seleção e o estilo devem ser mantidos em um zoom.

Ian Turton
fonte
No seu caso, funciona. Mas seu código não usa: resFactor: 1 e ratio: 1. que causa o redesenho quando o zoom é alterado. Seu exemplo não aciona um redesenho.
Boedy
bem, isso restringe o problema para você, então
Ian Turton