Javascript 更改指定图层的指针移动上的光标样式

Javascript 更改指定图层的指针移动上的光标样式,javascript,canvas,openlayers,openlayers-3,Javascript,Canvas,Openlayers,Openlayers 3,在geojson层上悬停时,快速(我相信对你们中的一些人来说是一个简单的)关于光标样式的问题 所以,我有一个剪辑层,我用它在wms层周围创建一个遮罩,另一个表示一些管理区域。 如下图所示 当我在行政区域上方悬停时,我想改变光标的样式,但似乎我遗漏了什么 我正在尝试使用以下代码块隔离到仅管理边界层: map.on('pointermove', function(e) { if (e.dragging) return; var pixel = e.map.getEventPixel(e.origi

在geojson层上悬停时,快速(我相信对你们中的一些人来说是一个简单的)关于光标样式的问题

所以,我有一个剪辑层,我用它在wms层周围创建一个遮罩,另一个表示一些管理区域。 如下图所示

当我在行政区域上方悬停时,我想改变光标的样式,但似乎我遗漏了什么

我正在尝试使用以下代码块隔离到仅管理边界层:

map.on('pointermove', function(e) {
if (e.dragging) return;
var pixel = e.map.getEventPixel(e.originalEvent);
var hit = e.map.forEachFeatureAtPixel(pixel, function(feature, layer) {
    return vectorJLS.get('layer_name') === 'jls';
});
   e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});
更新

虽然JGH稍微调整了代码,但仍然不起作用。我已经检测到这个问题存在于我用于掩模剪辑的层中,当删除时,JGH提供的代码可以正常工作

下面是我用于遮罩剪裁的代码

 var clipLayer = new ol.layer.Image({
     source: new ol.source.ImageVector({
         source: new ol.source.Vector({
             url: 'geojson/clip_wgs.geojson',
             format: new ol.format.GeoJSON()
         }),
         style: new ol.style.Style({
             fill: new ol.style.Fill({
                 color: 'black'
             })
         })
     })
 });


clipLayer.on('postcompose', function(e) {
    e.context.globalCompositeOperation = 'source-over';
});
clipLayer.on('precompose', function(e) {
    e.context.globalCompositeOperation = 'destination-in';
});
clipLayer.setMap(map);
在更改光标样式时是否可能忽略剪辑层,或者我是否应该采取另一种方法

更新-2

我对代码做了一些调整,但在clipedLayer打开时仍然没有成功

map.on('pointermove', function(e) {
    if (e.dragging) return;

    var pixel = e.map.getEventPixel(e.originalEvent);
    // initialize the hit variable to false (not found)

    var hit = map.hasFeatureAtPixel(e.pixel, {
        layerFilter: function(layer) {
            return vectorJLS.get('layer_name') === 'jls';
        }
    });

    console.log(hit)
});

有趣的问题如果我可以在你的函数中添加

,你基本上是在鼠标位置的所有层中循环。在该循环中,如果层具有正确的名称,则设置指针;如果层具有不同的名称,则删除指针(或将其设置为其他名称)

实际上,它取决于图层顺序:
示例:第1层=目标->设置自定义指针。第2层=其他层->删除指针。=>最终指针:已删除

示例:第1层=其他层->删除指针。第2层=目标->设置自定义指针。=>最终指针:自定义指针

当您设置
hit
变量时,会发生循环,即当您覆盖每个层的值时,它只对应于最后一层

map.on('pointermove', function(e) {
  if (e.dragging) return;

  var pixel = e.map.getEventPixel(e.originalEvent);
  // initialize the hit variable to false (not found)
  var hit = false;
  e.map.forEachFeatureAtPixel(pixel, function(feature, layer) {
    if ( vectorJLS.get('layer_name') === 'jls') {
          //IF we have found the layer, flag it (but don't return anything!)
          hit = true;
     }
  });

  e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});

在函数中,基本上是在鼠标位置的所有层之间循环。在该循环中,如果层具有正确的名称,则设置指针;如果层具有不同的名称,则删除指针(或将其设置为其他名称)

实际上,它取决于图层顺序:
示例:第1层=目标->设置自定义指针。第2层=其他层->删除指针。=>最终指针:已删除

示例:第1层=其他层->删除指针。第2层=目标->设置自定义指针。=>最终指针:自定义指针

当您设置
hit
变量时,会发生循环,即当您覆盖每个层的值时,它只对应于最后一层

map.on('pointermove', function(e) {
  if (e.dragging) return;

  var pixel = e.map.getEventPixel(e.originalEvent);
  // initialize the hit variable to false (not found)
  var hit = false;
  e.map.forEachFeatureAtPixel(pixel, function(feature, layer) {
    if ( vectorJLS.get('layer_name') === 'jls') {
          //IF we have found the layer, flag it (but don't return anything!)
          hit = true;
     }
  });

  e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});

最后,在JGH同事的帮助下,我为我的问题找到了合适的解决方案。 在搜索发布页面和谷歌机器时,我偶然发现了一些关于图层过滤器的有趣信息,以及它在方法hasFeatureAtPixel中的用法。此代码块适用于3.20.1以下版本,但更多信息请参见

对于较新的版本,您应该像这样使用图层过滤器(我使用的是4.6.5)

或者是我的特殊问题

map.on('pointermove', function(e) {
    if (e.dragging) return;
    var pixel = e.map.getEventPixel(e.originalEvent);
    var hit = map.hasFeatureAtPixel(e.pixel, {
        layerFilter: function(layer) {
            return layer.get('layer_name') === 'jls';
        }
    });
     e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});

希望能有所帮助:)

最后,在JGH同事的帮助下,我找到了解决问题的合适方法。 在搜索发布页面和谷歌机器时,我偶然发现了一些关于图层过滤器的有趣信息,以及它在方法hasFeatureAtPixel中的用法。此代码块适用于3.20.1以下版本,但更多信息请参见

对于较新的版本,您应该像这样使用图层过滤器(我使用的是4.6.5)

或者是我的特殊问题

map.on('pointermove', function(e) {
    if (e.dragging) return;
    var pixel = e.map.getEventPixel(e.originalEvent);
    var hit = map.hasFeatureAtPixel(e.pixel, {
        layerFilter: function(layer) {
            return layer.get('layer_name') === 'jls';
        }
    });
     e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});

希望有帮助:)

如前所述,这取决于图层顺序。一旦找到函数所在的层,就需要退出该函数interest@JGH请你详细说明一下,这取决于图层的顺序。一旦找到函数所在的层,就需要退出该函数interest@JGH请您详细说明一下,谢谢您的努力,但不幸的是,上面的代码在激活剪辑层时不起作用。我将在更新的问题中进一步解释…感谢您的努力,但不幸的是,上面的代码在激活剪辑层时不起作用。我将在更新的问题中进一步解释。。。