Рендеринг векторных объектов

В OpenLayers у меня есть объект LineFeature.

Я меняю стиль объекта (например, my_line.style.strokeColor="Black").

Но цвет на экране не меняется, пока я не увеличу/уменьшу масштаб (т.е. не перерисую).

Как сообщить векторному объекту, что ему нужно перерисовать?


person Richard    schedule 19.07.2011    source источник


Ответы (2)


Попробуйте вызвать метод redraw() на векторном слое, содержащем объект, после изменения стиля.

ОБНОВЛЕНИЕ: Если вы не хотите перерисовывать весь слой, вы можете попробовать метод drawFeature(). Вы, вероятно, лучше поймете, как это работает, если посмотрите на его код:

/**
     * APIMethod: drawFeature
     * Draw (or redraw) a feature on the layer.  If the optional style argument
     * is included, this style will be used.  If no style is included, the
     * feature's style will be used.  If the feature doesn't have a style,
     * the layer's style will be used.
     * 
     * This function is not designed to be used when adding features to 
     * the layer (use addFeatures instead). It is meant to be used when
     * the style of a feature has changed, or in some other way needs to 
     * visually updated *after* it has already been added to a layer. You
     * must add the feature to the layer for most layer-related events to 
     * happen.
     *
     * Parameters: 
     * feature - {<OpenLayers.Feature.Vector>} 
     * style - {String | Object} Named render intent or full symbolizer object.
     */
    drawFeature: function(feature, style) {
        // don't try to draw the feature with the renderer if the layer is not 
        // drawn itself
        if (!this.drawn) {
            return;
        }
        if (typeof style != "object") {
            if(!style && feature.state === OpenLayers.State.DELETE) {
                style = "delete";
            }
            var renderIntent = style || feature.renderIntent;
            style = feature.style || this.style;
            if (!style) {
                style = this.styleMap.createSymbolizer(feature, renderIntent);
            }
        }

        var drawn = this.renderer.drawFeature(feature, style);
        //TODO remove the check for null when we get rid of Renderer.SVG
        if (drawn === false || drawn === null) {
            this.unrenderedFeatures[feature.id] = feature;
        } else {
            delete this.unrenderedFeatures[feature.id];
        };
    }
person igorti    schedule 19.07.2011
comment
Есть ли способ перерендерить только одну функцию этого слоя? Если нет, то знаете почему? - person Richard; 20.07.2011
comment
Думает @igorti, я не смог увидеть повторную визуализацию в коде выше, но я верю, что комментарии являются точным описанием его конечной функции. Интересно и, возможно, неудивительно, что код предоставляет лучшую документацию, чем сама документация. - person Richard; 02.08.2011
comment
Внутри этого метода есть вызов this.renderer.drawFeature(), который должен заставить средство визуализации перерисовать функцию. - person igorti; 02.08.2011

привет, вы можете сделать это, как показано ниже:

....
map.vectorlayer.addFeatures(line);
var mystyle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
mystyle.strokeColor = '#7200FF';
...
map.vectorlayer.styleMap.styles['default'].defaultStyle = mystyle;
map.vectorlayer.redraw(true);
person Aragon    schedule 20.07.2011