简体   繁体   English

OpenLayers修改功能样式而不覆盖交互样式

[英]OpenLayers modify feature style without overwritting interactions style

Is there any way to modify a single feature's style without modifying default style on select interaction? 有没有办法修改单个功能的样式而不修改选择交互的默认样式?

Here is a simple piece of code showing my problem and a jsfiddle 这是一段简单的代码,显示了我的问题和一个jsfiddle

Minimal html : 最小的HTML:

<input type="button" id="switcher" value="Change style"></input>
<div id="map" class="map"></div>

And a simple script : 还有一个简单的脚本:

let vectorLayer = new ol.layer.Vector({
  source: new ol.source.Vector({wrapX: false})
});

let map = new ol.Map({
  target: 'map',
  layers: [
    new ol.layer.Tile({
      source: new ol.source.OSM({wrapX: false})
    }),
    vectorLayer,
  ],
  view: new ol.View({
    center: ol.proj.transform([9, 44.65], 'EPSG:4326', 'EPSG:3857'),
    zoom: 8
  })
});

let source = vectorLayer.getSource();

let draw = new ol.interaction.Draw({
  source: source,
  type: 'Polygon'
});

let selectOnHover = new ol.interaction.Select({
    source: source,
    condition: ol.events.condition.pointerMove
});

map.addInteraction(draw);
map.addInteraction(selectOnHover);

let fill = new ol.style.Fill({
  color: 'rgba(255,0,255,0.4)'
});
let stroke = new ol.style.Stroke({
  color: '#00FF00',
  width: 5
});
let customStyle = new ol.style.Style({
  image: new ol.style.Circle({
    fill: fill,
    stroke: stroke,
    radius: 5
  }),
  fill: fill,
  stroke: stroke
});

document.getElementById('switcher').onclick = function(event) {
  let features = source.getFeatures();
  if(features.length>0)
    features[0].setStyle(customStyle);
}

As you can see by testing on jsfiddle, clicking on the button will correctly change the style of the first drawn feature but also seems to overwritte the default style on hover (here simply a select interaction with condition). 正如您在jsfiddle上测试所看到的,单击该按钮将正确地更改第一个绘制特征的样式,但似乎也会覆盖悬停时的默认样式(这里只是与条件的选择交互)。

How can I keep the default style on hover while changing my feature style? 如何在更改我的功能样式时保持悬停的默认样式?

A style on a feature overrides all style functions (and default styles for interactions, etc). 要素上的样式将覆盖所有样式函数(以及交互的默认样式等)。 But you could give a feature a customStyle property and use that only in a layer style function instead of a default style, while interactions would continue to use the defaults for interactions. 但是,您可以为要素提供customStyle属性,并仅在图层样式函数中使用它而不是默认样式,而交互将继续使用默认值进行交互。

let defaultFill = new ol.style.Fill({
  color: 'rgba(255,255,255,0.4)'
});
var defaultStroke = new ol.style.Stroke({
  color: '#3399CC',
  width: 1.25
});
var defaultStyles = [
  new ol.style.Style({
    image: new ol.style.Circle({
      fill: defaultFill,
      stroke: defaultStroke,
      radius: 5
    }),
    fill: defaultFill,
    stroke: defaultStroke
  })
];

let vectorLayer = new ol.layer.Vector({
  source: new ol.source.Vector({wrapX: false}),
  style: function(feature) { 
    var customStyle = feature.get('customStyle');
    return customStyle || defaultStyles;
  }
});


...
...

document.getElementById('switcher').onclick = function(event) {
  let features = source.getFeatures();
  if(features.length>0)
    features[0].set('customStyle', customStyle);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM