1 votos

¿Cómo hacer que los Overlays en OpenLayers sean exclusivos usando eventos a nivel de casilla?

En mi mapa tengo 3 capas superpuestas, las cuales deben ser mutuamente excluyentes, es decir, no pueden estar activadas (marcadas) al mismo tiempo. Pensé en usar eventos para activar las superposiciones como lo siguiente en mi archivo principal index.html:

function init(){ 
 var map, kml_1Layer, kml_2Layer, kml_3Layer; 
...
kml_1Layer.events.register("visibilitychanged", this, layerChanged);
kml_2Layer.events.register("visibilitychanged", this, layerChanged);
kml_3Layer.events.register("visibilitychanged", this, layerChanged); 
...
}

function layerChanged(layer) {
     if (layer.object.visibility) {
     switch (layer.object.name) {
        case "kml_1Layer":
              kml_2Layer.setVisibility(false);
              kml_3Layer.setVisibility(false);
              break;
        case "kml_2Layer":
              kml_1Layer.setVisibility(false);
              kml_3Layer.setVisibility(false);
              break;
        case "kml_3Layer":
              kml_1Layer.setVisibility(false);
              kml_2Layer.setVisibility(false);
              break;
     }
  }
}

Puede ver el sitio web aquí: http://genepoulin.net/geo/index.html Obviamente, los eventos no se activan.

¿Qué me estoy perdiendo aquí?

ACTUALIZADO y resuelto...

Código corregido (me equivoqué al nombrar los casos de conmutación):

function init(){ 
 var map, kml_1Layer, kml_2Layer, kml_3Layer; 
...
kml_1Layer.events.register("visibilitychanged", kml_1Layer, layerChanged);
kml_2Layer.events.register("visibilitychanged", kml_2Layer, layerChanged);
kml_3Layer.events.register("visibilitychanged", kml_3Layer, layerChanged); 
...
}

function layerChanged(layer) {
     if (layer.object.visibility) {
     switch (layer.object.name) {
        case "*given label of layer1*":
              kml_2Layer.setVisibility(false);
              kml_3Layer.setVisibility(false);
              break;
        case "*given label of layer2*":
              kml_1Layer.setVisibility(false);
              kml_3Layer.setVisibility(false);
              break;
        case "*given label of layer3*":
              kml_1Layer.setVisibility(false);
              kml_2Layer.setVisibility(false);
              break;
     }
  }
} 

Puedes ver el resultado en mi página.

1voto

naknode Puntos 143

Espero que sirva de ayuda, no he podido probarlo ya que estoy fuera de la oficina. Esto debería ser más fácil de mantener.

var radioLayer = [ kml_1Layer, kml_2Layer, kml_3Layer ];
var layerChanged = function( evt )
{
  var rList = this;
  if ( !evt.object.getVisibility() )
    return; // layer has been hidden, do not need check others
  for ( i = 0; i < rList.length; i++ )
    if ( rList[i] != evt.object )
      rList[i].setVisibility( false );
}

for ( i = 0; i < radioLayer.length; i++ )
  radioLayer[i].events.register( 'visibilitychanged', radioLayer, layerChanged );

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X