Javascript 传单:根据激活的图层切换标签

Javascript 传单:根据激活的图层切换标签,javascript,leaflet,gis,Javascript,Leaflet,Gis,我有一个包含三层的传单地图,从单独的geoJSON文件加载。 我有三个附加文件,每个文件都有latlong坐标和标签 我正在使用basemap control.layers在我的三个图层之间切换,我希望有一个覆盖图层复选框,该复选框将启用标签图层,具体取决于哪个basemap图层处于活动状态 var basemaps= { "layer1": layer1, "layer2": layer 2, "layer3": layer 3 }; 我正在使用图层组将标签放在一起。 我试着使用Active

我有一个包含三层的传单地图,从单独的geoJSON文件加载。 我有三个附加文件,每个文件都有latlong坐标和标签

我正在使用basemap control.layers在我的三个图层之间切换,我希望有一个覆盖图层复选框,该复选框将启用标签图层,具体取决于哪个basemap图层处于活动状态

var basemaps= {
"layer1": layer1,
"layer2": layer 2,
"layer3": layer 3
};
我正在使用图层组将标签放在一起。 我试着使用ActiveLayer插件来帮助我选择哪一个baselayer当前处于活动状态,但似乎总是出现一些问题

我不熟悉javascript,并且在学习的过程中不断学习

我的其余控制代码:

var picker = L.control.activeLayers(basemaps, showlabels {collapsed:false}).addTo(map);

if (picker.getActiveBaseLayer() == "layer1")
    {activelabel = label1};
if (picker.getActiveBaseLayer() == "layer2")
    {activelabel = label2};
if (picker.getActiveBaseLayer() == "layer2")
    {activelabel = label3};

var showlabels = {
"labels": activelabel
};  
有更好的方法吗?我想为我的图层设置单选按钮,为我的标签设置一个复选框,根据选中的单选按钮更改标签

编辑

我找到了这个代码baselayerchange

map.on('baselayerchange', function(a) {
if (picker.getActiveBaseLayer().name == "layer1")
{activelabel = label1};
if (picker.getActiveBaseLayer().name == "layer2")
{activelabel = label2};
if (picker.getActiveBaseLayer().name == "layer3")
{activelabel = labels3};
});

当我执行console.log时,它似乎会告诉我活动层,但由于某些原因,它不会更新显示的标签。

您有几个基本层,每个基本层都有单独的覆盖层(在您的情况下包含标签)。您希望覆盖是可切换的,但只应显示与当前基础层关联的覆盖

您不一定需要插件来实现这一点

正如您所想,您需要设置一个事件侦听器来“手动”分配适当的标签覆盖。事件确实是合适的,但是仅仅将新标签分配给
activelabel
变量是不够的,因为Layers控件使用了实例化它时的值

相反,您应该将您的
activelabel
a设置为,然后在
上的“baselayerchange”
中,首先重新添加适当的标签层

var-activelabel=L.layerGroup();
var showlabels={
“标签”:activelabel
};
map.on('baselayerchange',函数(事件){
activelabel.clearLayers();
交换机(事件层){
案例层1:
标签1.addTo(activelabel);
打破
案例第二层:
第2层。添加到(activelabel);
打破
案例第3层:
第3层。添加到(activelabel);
打破
}
});
现场演示:

另一个可能的解决方案是使用插件,它将使您能够将每个标签覆盖层与其对应的基础层相关联,但让插件将覆盖层添加到可切换的层组中

//用于标签覆盖的图层组容器。
var labelsGroup=L.layerGroup().addTo(map);
//基础层1:将容器层组用于平铺层
//以及一个将接收标签的子组,
//选择基层时发送到标签组。
var group1=L.layerGroup().addTo(map);
var subgroup1=L.featureGroup.Subgroups(labelsGroup).addTo(group1);
base1.addTo(第1组);
标签1.添加到(亚组1);
//基层2。
var group2=L.layerGroup();
var subgroup2=L.featureGroup.Subgroups(labelsGroup).addTo(group2);
base2.addTo(第2组);
标签2.addTo(亚组2);
控制层({
//基层。
“基本1”:组1,
“基本2”:组2
}, {
//覆盖。这将打开/关闭标签。
“标签”:标签组
}).addTo(地图);
现场演示:

虽然此解决方案需要每个基本层额外2个层组,但它避免了必须自己设置事件侦听器,如果有足够多的基本层,这可能会有点麻烦

免责声明:我是传单.FeatureGroup.SubGroup插件的作者


太棒了!非常感谢你!