Open Layers 3层可见性——传递变量的问题
Open Layers 3 layer visibility - problems passing variables
我已经建立了一个非常基本的功能,可以打开我在地图上的图层。
这是初始化图层的代码:
var featurelayer;
featurelayer = new ol.layer.Tile({
name: 'featurelayer',
source: new ol.source.TileWMS({url: 'http://myserver/geoserver/wms',
serverType: 'geoserver',
params:{
'LAYERS':"layergroup:mylayer", 'TILED':true
}
}),
visible: false
});
map.addLayer(featurelayer);
我的网站上有一个列表项,单击它会激活我用来尝试打开图层的功能。我的 html 和 jQuery 函数如下:
<li class='last'><a href='#'><i class="fa fa-circle text-info"></i><span> Flood Zone 3b (Functional Floodplain)</span></a></li>
$("a.layer").click(function() {
map.getLayers().forEach(function(layer) {
if (layer.get('name') === this.id) {
featurelayer.setVisible(true);
}
});
});
这段代码确实有效,它在地图上显示了图层。我的问题是我会有不止一层,理想情况下我希望能够将与该层同名的列表项中的 ID 传递给我的 setVisible 事件。
我似乎不知道该怎么做,因为我的控制台日志总是返回未定义的;我已经尝试创建一个我等于 'this.id' 的变量,但这不起作用 - 我需要通过我的点击功能传递我的 ID 吗?如果注册我的图层名称与我的列表项 ID 匹配,为什么我会收到未定义的错误?
感谢您提供的任何帮助!
是不是 this.id 试图访问 'layer.id' (可能未定义)因为它在 forEach循环?
尝试在进入循环之前获取 id:
$("a.layer").click(function () {
var lid = $(this).attr('id');
map.getLayers().forEach(function (layer) {
if (layer.get('name') == lid) {
layer.setVisible(true);
}
});
});
编辑:这是您需要的吗? http://jsfiddle.net/fbma/3z1L6ttn/1/
这两个li项我都添加了id,click事件与class'last'相关。此外,在迭代的层对象上设置可见性。
我接受了 Fbma 的回答并添加了更多的 if 语句来通过设置一个调用 getVisible() 方法的变量来检查图层是否已经可见,所以下面的代码现在可以工作了,谢谢你的帮助!
$(".layerlist").click(function() {
var lid = $(this).attr('id');
map.getLayers().forEach(function (layer) {
if (layer.get('name') == lid) {
var visibility = layer.getVisible();
if (visibility == false) {
layer.setVisible(true);
}
if (visibility == true) {
layer.setVisible(false);
}
}
});
});
我已经建立了一个非常基本的功能,可以打开我在地图上的图层。
这是初始化图层的代码:
var featurelayer;
featurelayer = new ol.layer.Tile({
name: 'featurelayer',
source: new ol.source.TileWMS({url: 'http://myserver/geoserver/wms',
serverType: 'geoserver',
params:{
'LAYERS':"layergroup:mylayer", 'TILED':true
}
}),
visible: false
});
map.addLayer(featurelayer);
我的网站上有一个列表项,单击它会激活我用来尝试打开图层的功能。我的 html 和 jQuery 函数如下:
<li class='last'><a href='#'><i class="fa fa-circle text-info"></i><span> Flood Zone 3b (Functional Floodplain)</span></a></li>
$("a.layer").click(function() {
map.getLayers().forEach(function(layer) {
if (layer.get('name') === this.id) {
featurelayer.setVisible(true);
}
});
});
这段代码确实有效,它在地图上显示了图层。我的问题是我会有不止一层,理想情况下我希望能够将与该层同名的列表项中的 ID 传递给我的 setVisible 事件。
我似乎不知道该怎么做,因为我的控制台日志总是返回未定义的;我已经尝试创建一个我等于 'this.id' 的变量,但这不起作用 - 我需要通过我的点击功能传递我的 ID 吗?如果注册我的图层名称与我的列表项 ID 匹配,为什么我会收到未定义的错误?
感谢您提供的任何帮助!
是不是 this.id 试图访问 'layer.id' (可能未定义)因为它在 forEach循环?
尝试在进入循环之前获取 id:
$("a.layer").click(function () {
var lid = $(this).attr('id');
map.getLayers().forEach(function (layer) {
if (layer.get('name') == lid) {
layer.setVisible(true);
}
});
});
编辑:这是您需要的吗? http://jsfiddle.net/fbma/3z1L6ttn/1/
这两个li项我都添加了id,click事件与class'last'相关。此外,在迭代的层对象上设置可见性。
我接受了 Fbma 的回答并添加了更多的 if 语句来通过设置一个调用 getVisible() 方法的变量来检查图层是否已经可见,所以下面的代码现在可以工作了,谢谢你的帮助!
$(".layerlist").click(function() {
var lid = $(this).attr('id');
map.getLayers().forEach(function (layer) {
if (layer.get('name') == lid) {
var visibility = layer.getVisible();
if (visibility == false) {
layer.setVisible(true);
}
if (visibility == true) {
layer.setVisible(false);
}
}
});
});