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

¿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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.