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

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.