在 OpenLayers 中一次只显示一层

Only show one layer at a time in OpenLayers

我在 OpenLayers 中有两个叠加层,我不希望它们同时显示。这是我正在使用的代码,这样当有人使用图层切换器时,另一层就会关闭。问题是此代码再次触发 'changeLayer' 事件侦听器并且该函数隐藏了两个层。

有没有其他方法可以强制用户一次只能查看一层?理想情况下,我希望图层切换器框中的单选按钮而不是复选框。

var mapLayerChanged = function(event) {
  if (event.layer.name == "Sea Cells") {
    $('.toolbar .view-options').show();

    map.layers[1].setVisibility(false);
  } else if (event.layer.name == "Coast Cells") {
    $('.toolbar .view-options').hide();

    map.layers[2].setVisibility(false);
  }
}

map = new OpenLayers.Map( {
  div : 'map',
  panDuration : 100,
  numZoomLevels : 18,
  maxResolution : maxResolution,
  maxExtent : maxExtent,
  displayProjection : new OpenLayers.Projection( "EPSG:2193" ),
  controls : [],
  eventListeners: {
    "changelayer" : mapLayerChanged
  }
} );

根据 http://dev.openlayers.org/apidocs/files/OpenLayers/Map-js.html

上的 changeLayer 定义

changelayer

triggered after a layer name change, order change, opacity change, params change, visibility change (actual visibility, not the layer’s visibility property) or attribution change (due to extent change). Listeners will receive an event object with layer and property properties. The layer property will be a reference to the changed layer. The property property will be a key to the changed property (name, order, opacity, params, visibility or attribution).

所以,

  1. 由于此事件是针对各种类型的 属性 更改(如图层名称更改、顺序更改、不透明度更改等)而触发的,因此您必须添加条件以检查当前事件是否被触发,因为仅层的可见性变化 属性。可以通过属性 property.
  2. 验证
  3. 此方法将在您更新可见性时触发,因此它会在您显示层以及隐藏层时触发;由 map.layers[1].setVisibility(false);
  4. 行触发

下面的代码可以解决您的问题,

function mapLayerChanged(event){
    if(event.property = "visibility"){
        if (event.layer.name == "Sea Cells") {
            if(event.layer.getVisibility()){
                $('.toolbar .view-options').show();
                map.getLayersByName("Coast Cells")[0].setVisibility(false);
            }
        } else if (event.layer.name == "Coast Cells") {
            if(event.layer.getVisibility()){
                $('.toolbar .view-options').hide();
                map.getLayersByName("Sea Cells")[0].setVisibility(false);
            }
        }
    }
}

它首先检查事件是否仅因为可见性变化而触发(通过 event.property == "visibility" 条件),并且仅当当前层的可见性为真时才会触发(通过 event.layer.getVisibility() 条件)

以上代码应符合您的要求。