I have a style function for LineStrings which will place a circle at each vertex of a feature.
When I select the feature it reverts to using the default style even though I have replicated my style function with a minor (colour) change. The other minor bug is that the function has two params (start, end) but I would like to place the circle on every vertex. Is there a way to achieve this?
Specifically though, is there a reason why it might be unable to display a selected feature using a style function? I am replicating the code below:
var selectedStyle = function (feature, resolution) {
var geometry = feature.getGeometry();
var styles = [
// linestring
new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#ffcc33',
width: 6
})
})
];
geometry.forEachSegment(function (start, end) {
var dx = end[0] - start[0];
var dy = end[1] - start[1];
var rotation = Math.atan2(dy, dx);
// circles
styles.push(new ol.style.Style({
geometry: new ol.geom.Point(end),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: 'rgb(0, 0, 255)'
}),
stroke: new ol.style.Stroke({ color: 'blue', width: 2 })
})
}));
});
return styles;
};
Answer
UPDATE:
When a function
is used on ol.Feature#setStyle
your feature is referenced with the this
keyword. Like:
var selectedStyle = function () {
console.info(this);
var feature = this;
var geometry = feature.getGeometry();
};
The reason that your features don't keep style is because they are (when selected) on a temporary ol.layer.Vector
. So, to achieve what you want you can do:
select.on('select', function(evt){
var selected = evt.selected;
var deselected = evt.deselected;
if (selected.length) {
selected.forEach(function(feature){
console.info(feature);
feature.setStyle(style_modify);
});
} else {
deselected.forEach(function(feature){
console.info(feature);
feature.setStyle(null);
});
}
});
http://jsfiddle.net/jonataswalker/eogk4r4b/
No comments:
Post a Comment