Mapbox gl js - 重叠图层和鼠标事件处理

Mapbox gl js - overlapping layers and mouse event handling

在 Mapbox GL JS 中是否有任何清晰可靠(并已描述)的机制来控制重叠层的鼠标事件?例如,我有 3 个重叠层,但希望只为顶部的层调用单击处理程序,而不是为所有 3 个层调用 - 这有可能吗?现在,作为一种解决方法,我跟踪 MouseEnter 和 MouseLeave 事件并基于此调用适当的处理程序。但我根本不喜欢这个解决方案,因为它用过多的逻辑破坏了我的代码。

不太清楚您遇到的是什么问题。如果您有三层(layer1、layer2、layer3),其中顶层是 layer1 并且您只想响应它的点击事件,您可以这样做:

map.on('click', 'layer1', function(e) {...})

如果这不是您的意思,也许可以澄清您所说的“重叠层”和“希望只为位于顶部的层调用点击处理程序”的意思。另外,请提供您当前的代码,并举例说明问题所在。

编辑

单击事件可以应用到单击点下方的所有图层,因此如果您想在一次单击事件中捕获多个图层,并确定单击的最上面的项目:

map.on('click', function(e) {
  let f = map.queryRenderedFeatures(e.point, { layers: ['layer1','layer2','layer3'] });
  if (f.length) {
    console.log(f[0]);  //topmost feature
  }
});

但是,如果您只想捕获单个图层的点击事件,您可以通过两种方式指定该图层:

map.on('click', function(e) {
  let f = map.queryRenderedFeatures(e.point, { layers: ['layer1'] });
  if (f.length) {
    console.log(f[0]);
    return;
  } 
  f = map.queryRenderedFeatures(e.point, { layers: ['layer2'] });
  if (f.length) {
    console.log(f[0]);
    return;
  }
  f = map.queryRenderedFeatures(e.point, { layers: ['layer3'] });
  if (f.length) {
    console.log(f[0]);
  }
});

或者如上面的原始答案:

map.on('click', 'layer1', function(e) {
  let f = map.queryRenderedFeatures(e.point, { layers: ['layer1'] });
  if (f.length) {
    console.log(f[0]);
  } 
  return;
});