Openlayers: selección o estilo perdidos en el redibujado de capas

10

Cuando hago zoom o muevo el mapa, mi capa se vuelve a dibujar. Esto es lo que quiero, porque tengo muchas características para cargar a la vez. Este es el 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)
});

El siguiente código es mi código de selección. Todo esto funciona como yo quiero. Sin embargo, cuando la capa se vuelve a dibujar, la selección se pierde y onFeatureUnselect no se dispara (lo que debería). No estoy seguro de si la selección realmente se pierde o si el estilo se restablece.

    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

Mis funciones onFeatureSelect y 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
fuente
¿Qué hay en tu función onFeatureSelect?
geographika
He actualizado mi publicación con las dos funciones
Boedy,

Respuestas:

4

He encontrado que la forma más fácil de mantener las selecciones de vectores a través del zoom, la panorámica y los redibujos es agregar una nueva capa de vectores vacía a su mapa, y cuando se seleccionan las características, coloque una copia en esta capa.

Puede configurar el estilo de capa de selección para que sea un estilo claramente visible.

En las funciones de resaltado de la herramienta de selección, agregue un clon de la función al seleccionar y elimínelo cuando se seleccione por 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]);
  }
}

Esto está un poco simplificado (y no probado): probablemente desee almacenar la capa de selección como una propiedad de su herramienta de selección.

Compruebe también la función getFeatureById: puede que tenga que usar una propiedad única diferente en su función en lugar de la ID.

geographika
fuente
Gracias por la respuesta. Creo que esta podría ser una buena solución. Estoy jugando con algún código, pero estoy atascado en el punto en que el evento onFeatureUnselect no se activa cuando se pierde la selección. Entonces, ¿en qué evento elimino los clones de características? Ver mi post original.
Boedy
@Boedy ver respuesta actualizada. Probablemente debería hacer todo en la función de selección. Seleccione una vez para seleccionar, y nuevamente para anular la selección.
geographika
¡Muchas gracias! Cheching si la entidad está en la capa seleccionada ayudó. Ahora solo tengo un problema de estilo, pero apuesto a que puedo resolverlo yo mismo.
Boedy
0

De mis experimentos ( http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html ) parece que la selección y el estilo deberían mantenerse sobre un zoom.

Ian Turton
fuente
En tu caso funciona. Pero su código no usa: resFactor: 1 y ratio: 1. lo que provoca el redibujo cuando se cambia el zoom. Su ejemplo no desencadena un nuevo dibujo.
Boedy
bueno, eso te reduce el problema entonces
Ian Turton