Andreas, Eric, Cédric, Thanks to all of you for your support. Your answers are very clear and well detailed. I'll make the changes according to what you proposed and come back if I have any more questions.
Thanks again, Alexandre Andreas Hocevar wrote: > 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 >> >> > > -- Alexandre Dubé Mapgears www.mapgears.com _______________________________________________ Dev mailing list Dev@openlayers.org http://openlayers.org/mailman/listinfo/dev