Hi, Alexandre Dube wrote: > I want to be able to save a OpenLayers.Style object or hash to a > vector feature. Currently, in code, feature.style exists but you must > define a hash or else it doesn't work. >
That's correct and expected. Let's call your hash "symbolizer". > My problem is that I want to be able to draw features to be used as > labels (floating text on the map). To be able to do so, I need to > define a StyleMap with a context to display the label (I manually set > feature.isLabel on "featureadded") [1] > You can evaluate the symbolizer from the context before setting feature.style: feature.style = myStyleMap.styles["default"].createSymbolizer(feature); > That works well, but as soon as I want to "bind / save" the style to > the feature, I mean set feature.style, I need to set a hash and the > feature will be rendered without the contexts. > The above snippet creates a symbolizer from the default style of the style map, and evaluates everything from the context. > I don't fully understand how the contexts, symbolizers, etc. work, but > my first guess would be to support OpenLayers.Style object directly in > the feature object. Does that make sense ? > No. Context-based styling and symbolizers-per-feature are two different things. > Or maybe I'm doing it wrong and their's an other way of "labeling" > features. My goal is to create features on a "cosmetic" layer with a > default style, then to be able to change the style of the features and > bind it to them (I mean without using rules on the layer level, but by > defining directly the feature style) > That makes sense, and the snippet above is the solution. You start with a layer with a StyleMap, and to override the evaluated style for a specific feature, you set feature.style with the symbolizer you get from Style::createSymbolizer. Note that if you want to change the label for such a feature later, you need to set symbolizer.label, not feature.attributes.name. Also note that if you want a point feature with just a label and without the geometry rendered, it is better to set the graphic: false symbolizer property instead of pointRadius: 0. Regards, Andreas. > Many many thanks, > > Alexandre > > > // [1] START > var labelStyle = { > label: "${name}", > labelSelect: true, > pointRadius: "${radius}" > }; > var styleOptions = { > context: { > 'name': function(feature) { > var szValue; > if (feature.attributes['name'] && feature.isLabel > === true) { > szValue = feature.attributes['name']; > } else { > szValue = ""; > } > return szValue; > }, > 'radius': function(feature) { > return (feature.isLabel === true) ? 0 : 6; > } > } > }; > > var style = new OpenLayers.Style( > OpenLayers.Util.applyDefaults( > labelStyle,OpenLayers.Feature.Vector.style["default"]), > styleOptions > ); > > var styleMap = new OpenLayers.StyleMap({ > "default": style > }); > > layer = new OpenLayers.Layer.Vector( > "Cosmetic", {'styleMap': styleMap}); > > // [1] END > > -- Andreas Hocevar OpenGeo - http://opengeo.org/ Expert service straight from the developers. _______________________________________________ Dev mailing list Dev@openlayers.org http://openlayers.org/mailman/listinfo/dev