Openlayers 3 使用ol3(Openlayers 3)更改图标的样式

Openlayers 3 使用ol3(Openlayers 3)更改图标的样式,openlayers-3,javascript,Openlayers 3,Javascript,我正在添加标记并使用getFeatureById更改其位置。是否有类似的方法更新样式和图标以设置功能,而无需使用重新创建 目前我是这样做的: function addArrowMarker(lat, long, angle, pointerimgsrc, arrowFlag) { iconFeature = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.transform([+long, +lat], 'EPS

我正在添加标记并使用getFeatureById更改其位置。是否有类似的方法更新样式和图标以设置功能,而无需使用重新创建

目前我是这样做的:

function addArrowMarker(lat, long, angle, pointerimgsrc, arrowFlag) {

    iconFeature = new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857')),
        name: 'NULL'
    });

    iconFeature.setId('arrowMarkerFeature');

    iconStyle = new ol.style.Style({
        image: new ol.style.Icon({
            src: pointerimgsrc,
            rotateWithView: true,
            rotation: angle * Math.PI / 180,
            anchor: [.5, .5],
            anchorXUnits: 'fraction', anchorYUnits: 'fraction',
            opacity: 1
        })
    });

    iconFeature.setStyle(iconStyle);

    vectorArrowSource[arrowFlag] = new ol.source.Vector({
        features: [iconFeature]
    });

    vectorArrowLayer[arrowFlag] = new ol.layer.Vector({
        source: vectorArrowSource[arrowFlag]
    });

    map.addLayer(vectorArrowLayer[arrowFlag]);
}
现在,如果角度有任何变化,那么我调用函数并再次设置新样式,如下所示

function changeArrowMarker(lat, long, angle, pointerimgsrc,arrowFlag) {    
    var myFeature = vectorArrowSource[arrowFlag].getFeatureById('arrowMarkerFeature');
    myFeature.getGeometry().setCoordinates(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857'));

    iconStyle = new ol.style.Style({
        image: new ol.style.Icon({
            src: pointerimgsrc,
            rotateWithView: true,
            rotation: angle * Math.PI / 180,
            anchor: [.5, .5],
            anchorXUnits: 'fraction', anchorYUnits: 'fraction',
            opacity: 1
        })
    });

    myFeature.setStyle(iconStyle);
}

我想没有更好的办法。请帮忙

样式是不可变的,因此更改样式的正确方法是替换样式

但是,对于您的需求,您应该考虑使用

这样,样式始终基于特征的角度属性计算。要移动或旋转几何体/图标,请使用以下命令:

function changeArrowMarker(lat, long, angle, arrowFlag) {
    var myFeature = vectorArrowSource[arrowFlag].getFeatureById('arrowMarkerFeature');
    myFeature.getGeometry().setCoordinates(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857'));
    myFeature.set('angle', angle);
}

这会提高代码的性能吗??因为我需要每200毫秒更改一次标记角度。@Akansha是否会有一个或多个使用此功能的功能?有多个这样的标记,所有标记都需要在200毫秒时更新。@Akansha for display性能如果使用图像,OpenGL通常会更好
function changeArrowMarker(lat, long, angle, arrowFlag) {
    var myFeature = vectorArrowSource[arrowFlag].getFeatureById('arrowMarkerFeature');
    myFeature.getGeometry().setCoordinates(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857'));
    myFeature.set('angle', angle);
}