OpenLayers 3:在悬停时显示矢量标签

加雷斯·琼斯(Gareth Jones)

我试图找到一种仅在鼠标悬停在功能图标上时才在OpenLayers矢量功能上显示标签的方法。我已经找到了一些类似事情的例子,但是没有什么能做我需要做的。在我看来,这将非常简单,但是我无法确定如何开始。

这就是我的功能样式代码的样子(几个示例中的一个)。请注意,我要从几个GeoJSON文件中引入要素数据,因此要feature.get(...)在颜色部分中输入s:

if (feature.get('level_pc') < 35 ) {
    var style = new ol.style.Style({
        fill: new ol.style.Fill({color: feature.get('shapefill')}),
        stroke: new ol.style.Stroke({color: feature.get('shapestroke')}),
        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
            anchor: [16, 16],
            anchorXUnits: 'pixels',
            anchorYUnits: 'pixels',
            opacity: 0.75,
            src: '/icons/aws-red.png'
        })),
        text: new ol.style.Text({
            font: '12px Roboto',
            text: feature.get('label'),
            fill: new ol.style.Fill({
                color: feature.get('textfill')
            }),
            stroke: new ol.style.Stroke({
                color: feature.get('textstroke'),
                width: 1
            })
        })
    });
    return style
} else { ...

我真的希望有一种方法可以在样式定义中插入一些代码,以创建悬停交互,而不必创建每种样式的副本,然后编写一些额外的代码来在悬停/非悬停样式之间进行切换。必要的。也许可以通过在鼠标悬停时将文本颜色的Alpha值设置为255以及在其他时间将其设置为0的方式来实现。也许我太乐观了。

有人有我可以检查的想法或例子吗?

谢谢加雷斯


编辑:多亏了何塞,我现在离目标越来越近了。自从我第一次提出问题以来,我的原始代码已经有所更改。现在,我通过一个从GeoJSON数据中读取图标文件名称的函数将样式应用于每个功能。例如,闸门显示为“闸门打开”或“闸门关闭”图标,筒仓显示为“ silo-high”,“ silo-medium”或“ silo-low”图标。正确的图标和文本会在所有功能上悬停显示,这很棒-只是当我不将鼠标悬停在这些图标上时,会显示不正确的图标-它会在所有功能上显示“ silo-low”图标。当我将鼠标悬停在一个图标上时,它会显示正确的图标,然后在我不再悬停时将其还原。

这是我更新的代码(的重要部分):

var structuresStyleHover = function(feature, resolution) {
    style = new ol.style.Style({
        fill: new ol.style.Fill({color: feature.get('shapefill')}),
        stroke: new ol.style.Stroke({color: feature.get('shapestroke')}),
        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
            anchor: [16, 16],
            anchorXUnits: 'pixels',
            anchorYUnits: 'pixels',
            opacity: 1,
            src: '/icons/'+feature.get('icon')+'-'+feature.get('status').toLowerCase()+'.png'
        })),
        text: new ol.style.Text({
            font: '12px Roboto',
            text: feature.get('label'),
            fill: new ol.style.Fill({
                color: feature.get('textfill')
            }),
            stroke: new ol.style.Stroke({
                color: feature.get('textstroke'),
                width: 1
            })
        })
    })
    return style;
};

var styleCache = {};
var styleFunction = function(feature,resolution) {
      var radius = 16;
      var style = styleCache[radius];
      if (!style) {
        style = new ol.style.Style({
            image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
                anchor: [16, 16],
                anchorXUnits: 'pixels',
                anchorYUnits: 'pixels',
                opacity: 0.5,
                src: '/icons/'+feature.get('icon')+'-'+feature.get('status').toLowerCase()+'.png'
            })),
        });
        styleCache[radius] = style;
      }
      return style;
};

var structuresLayer = new ol.layer.Vector({
    source: structuresSource,
    style: styleFunction
});

...

var map = new ol.Map({
    layers: [paddocksLayer,structuresLayer],
    interactions: ol.interaction.defaults({
        altShiftDragRotate: false,
        dragPan: false,
        rotate: false
    }).extend([new ol.interaction.DragPan({kinetic: null})]),
    target: olMapDiv,
    view: view
});

...

map.on('pointermove', function(evt) {
    if (evt.dragging) {
        return;
    }
    structuresLayer.getSource().getFeatures().forEach(f=>{
        f.setStyle(styleFunction);
    });
    var pixel = map.getEventPixel(evt.originalEvent);
    map.forEachFeatureAtPixel(pixel,function(feature,resolution) {
        feature.setStyle(structuresStyleHover(feature,resolution));
        return feature;
    });    

});

我没有任何错误-除非鼠标悬停在图标上,否则它不会显示正确的图标。

我确定我确实缺少一些明显的东西,但是我无法解决。有什么想法吗?

何塞·埃莫西利亚·罗德里戈

您可以使用setStyle

var mystyle = new ol.style.Style({
  fill: new ol.style.Fill({color: '#00bbff'}),
  stroke: new ol.style.Stroke({color: '#fff'}),
  image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
    anchor: [16, 16],
    anchorXUnits: 'pixels',
    anchorYUnits: 'pixels',
    scale : 0.1,
    opacity: 1,
    src: 'http://2.bp.blogspot.com/_Sdh3wYnDKG0/TUiIRjXEimI/AAAAAAAAQeU/bGdHVRjwlhk/s1600/map+pin.png'
  })),
  text: new ol.style.Text({
    font: '12px Roboto',
    text: 'AAAAAAAAAAAAAAA',
    fill: new ol.style.Fill({
      color: '#ffbb00'
    }),
    stroke: new ol.style.Stroke({
      color: '#000',
      width: 1
    })
  })
});
var styleCache = {};
var styleFunction = function(feature) {
  var radius = 3;
  var style = styleCache[radius];
  if (!style) {
    style = new ol.style.Style({
      image: new ol.style.Circle({
        radius: radius,
        fill: new ol.style.Fill({
          color: 'rgba(255, 153, 0, 0.4)'
        }),
        stroke: new ol.style.Stroke({
          color: 'rgba(255, 204, 0, 0.2)',
          width: 1
        })
      })
    });
    styleCache[radius] = style;
  }
  return style;
};

var vector = new ol.layer.Vector({
  source: new ol.source.Vector({
    url: 'http://openlayers.org/en/v3.17.1/examples/data/kml/2012_Earthquakes_Mag5.kml',
    format: new ol.format.KML({
      extractStyles: false
    })
  }),
  style: styleFunction
});

var raster = new ol.layer.Tile({
  source: new ol.source.Stamen({
    layer: 'toner'
  })
});

var map = new ol.Map({
  layers: [raster, vector],
  target: 'map',
  view: new ol.View({
    center: [0, 0],
    zoom: 2
  })
});

map.on('pointermove', function(evt) {
  if (evt.dragging) {
    return;
  }
  vector.getSource().getFeatures().forEach(f=>{
    f.setStyle(styleFunction);
  });
  var pixel = map.getEventPixel(evt.originalEvent);
  map.forEachFeatureAtPixel(pixel,function(feature) {
    feature.setStyle(mystyle);
    return feature;
  });    

});
#map {
  position: relative;
}
<title>Earthquakes in KML</title>
<link rel="stylesheet" href="http://openlayers.org/en/v3.17.1/css/ol.css" type="text/css">
<script src="http://openlayers.org/en/v3.17.1/build/ol.js"></script>
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<div id="map" class="map"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenLayers 3:在悬停时显示矢量标签

来自分类Dev

地图平移或缩放时,OpenLayers 3矢量层失去样式

来自分类Dev

如何从Openlayers 3的矢量层获取要素

来自分类Dev

Openlayers 3调试

来自分类Dev

OpenLayers 3主版本

来自分类Dev

Openlayers 3 center map

来自分类Dev

OpenLayers 3 BBOX策略

来自分类Dev

Openlayers 3 readExtensions GPX

来自分类Dev

ZoomToExtent OpenLayers 3

来自分类Dev

OpenLayers 3直线

来自分类Dev

Openlayers 3不良坐标

来自分类Dev

React + Mobx + Openlayers 3

来自分类Dev

OpenLayers矢量样式更改问题

来自分类Dev

Openlayers 3:向功能添加文本标签

来自分类Dev

如何使openlayers 3缩放控件显示在右侧?

来自分类Dev

OpenLayers3不显示图像

来自分类Dev

Openlayers 3:缩放级别更改时,更改矢量层

来自分类Dev

如何从openlayers3中的矢量层获取点坐标?

来自分类Dev

OpenLayers 3中的样式矢量平铺图层点要素被裁剪

来自分类Dev

OpenLayers 3 重投影矢量图层 (v4.3.2)

来自分类Dev

UTFGrid支持或OpenLayers 3的示例

来自分类Dev

在OpenLayers 3中更新底图

来自分类Dev

Openlayers 3 stop event propagation

来自分类Dev

Openlayers 3:动画点功能

来自分类Dev

OpenLayers 3定义轴顺序

来自分类Dev

Openlayers 3停止事件传播

来自分类Dev

Openlayers 3关闭平滑滚动

来自分类Dev

OpenLayers 3:简单的LineString示例

来自分类Dev

openlayers中的快照控制3