On Aug 27, 2010, at 11:42 , Slawomir Messner wrote:

> Ok, I've one...two questions.
> When I shouldn't use 
> style.styles["default"].defaultStyle["attribName"]
> 
> then how can I change ..let's say fontSize... for the whole layer? Create a 
> new Style and replace the old one?

var defaultStyle = styleMap.styles["default"].defaultStyle;
styleMap.styles["default"].setDefaultStyle(
    OpenLayers.Util.extend(defaultStyle, {attrib: value})
);


> And how to change the fontSize dependent on the map resolution. Is it 
> possible by rules or do I have to use ${} with context? That's my current 
> code:

You can do both, but a context is definitely more convenient. What you have 
below should be fine.

Regards,
Andreas.
> ...
> var defaultStyle = OpenLayers.Util.applyDefaults({ 'pointRadius': 5, 
> 'fillColor': '#123456', 'fillOpacity': 0.6, 'stroke': true, 'strokeColor': 
> '#654321', 'strokeOpacity': 1, 'strokeWidth': 1, 'strokeDashstyle': 'solid', 
> "label": "${getName}", 'fontFamily': 'TeuthoBD', "fontWeight": "bold", 
> "fontSize": "${getFontSize}", "fontColor": "#000000", "labelAlign": "lt" }, 
> OpenLayers.Feature.Vector.style["default"]);
> var selectStyle = OpenLayers.Util.applyDefaults({ 'pointRadius': 6, 
> 'fillColor': '#123456', 'fillOpacity': 0.8, 'stroke': true, 'strokeColor': 
> '#654321', 'strokeOpacity': 1, 'strokeWidth': 1, 'strokeDashstyle': 'solid', 
> "label": "${getName}", 'fontFamily': 'TeuthoBD', 
> "fontWeight": "bold", "fontSize": "${getFontSize}", "fontColor": "#000000", 
> "labelAlign": "lt" }, OpenLayers.Feature.Vector.style["default"]);var 
> layerStyleMap = new OpenLayers.StyleMap({ 'default': defaultStyle, 'select': 
> selectStyle });
> layerStyleMap.styles["default"].context = { getName: 
> userContext.labelFunction, getFontSize: userContext.labelSize };
> layerStyleMap.styles["select"].context = { getName: 
> userContext.labelFunction, getFontSize: userContext.labelSize };
> userContext.paintLayer = new OpenLayers.Layer.Vector("BayDat", { styleMap: 
> layerStyleMap});
> userContext.map.addLayer(userContext.paintLayer);
> ....
>     labelSize: function (feature) {
>         return Math.min(20, Math.max(5, 6000 / 
> feature.layer.map.getResolution())) + "px";
>     },
>  
>     labelFunction: function (feature) {
>         if (feature.attributes.value != undefined) {
>             return feature.attributes.value;
>         } else {
>             return '';
>         }
>     },
> Regards,
> Slawomir
> 
> Am 27.08.2010 10:17, schrieb Slawomir Messner:
>> 
>>   Thanks for the very fast and detailed answer.
>> We cannot render features at the server and send them as an image, 
>> because we want them editable and the look and feel of a desktop tool. I 
>> works well but not every part fits together. (I hope it changes with 
>> your hints.)
>> I think it would be also possible to edit them on the server, but it 
>> works good with the Controls in OL on the client side, especially in 
>> chrome it's fast enough and we hope that the other browsers will follow.
>> I see, I have many things to read, design and (re-)code. But now I know 
>> which way to go.
>> Thx again,
>> Slawomir
>> 
>> Am 27.08.2010 09:18, schrieb Andreas Hocevar:
>>> On Aug 27, 2010, at 07:52 , Slawomir Messner wrote:
>>> 
>>>> 1. Is this the recommended way to work with styles or is there a better
>>>> way? Is there maybe already a tool?
>>> You have several options, as styling has evolved in OpenLayers 2.0. For the 
>>> recommended way of client-side styling in OpenLayers, please refer to 
>>> http://trac.openlayers.org/wiki/Styles. This is all about rule based 
>>> styling.
>>> 
>>> If you want to use a tool, you can go through SLD (see 
>>> http://openlayers.org/dev/examples/sld.html) and use an SLD editor. There 
>>> you have several options - I only list some that I know to be useful:
>>> 
>>>   * Web-based: OpenGeo Suite Styler (http://opengeo.org/products/suite/)
>>>   * Desktop GIS: UDig (http://udig.refractions.net/)
>>>   * If you are familiar with CSS, you can try GeoServer CSS 
>>> (http://dwins.wordpress.com/2010/07/25/geoserver-css-conversion/)
>>> 
>>>> Jep, we could put any value in
>>>> attributes or feature.sytle but sometimes there are more then 2000
>>>> features so we want to have as few styles as possible.
>>> With that many features, you should not even consider rendering them at the 
>>> client. Instead, use a WMS (e.g. GeoServer or MapServer). But what I said 
>>> above about SLD is also valid here - SLD is the way to go with GeoServer. 
>>> For MapServer, the primary way to define styles is through the mapfile, 
>>> which some people prefer over SLD.
>>> 
>>>> Are rule maybe
>>>> better even if harder to parse?
>>>>   The functions described below are working already, but not always
>>>> together, the workflow below will be the new one and before I change
>>>> "all" our controls and loading mechanism from every source... I would
>>>> like to have some opinions.
>>> This is because you should not mix rule based styling (i.e. layers with a 
>>> styleMap) with symbolizer based styling (i.e. features with a style).
>>> 
>>>> 2. The docs telling you at OL.Feature.Vector under
>>>> OpenLayers.Feature.Vector.style "OpenLayers features can have a number
>>>> of style attributes..." but it's the layer, right?
>>> Both is true. In the old way of styling, symbolizers defined on a feature 
>>> (as style property) take precedence over the ones defined on the layer 
>>> (also as style property).
>>> 
>>>> I see my style only
>>>> if I set OpenLayers.Feature.Vector.style like {'pointRadius':6,
>>>> fillColor:'#FF0000'} not OL.StyleMap({'default': {'pointRadius':6,
>>>> fillColor:'#FF0000'}, 'select': {'pointRadius':6, fillColor:'#0000FF'}
>>>> }) or {'default': {'pointRadius':6, fillColor:'#FF0000'}, 'select':
>>>> {'pointRadius':6, fillColor:'#0000FF'} }.
>>> The OpenLayers.Style object cannot be used with features, it is part of the 
>>> rule based styling framework. Only symbolizers are supported. So what you 
>>> describe here is expected.
>>> 
>>>> 3. StyleMap, Style and Object are the classes you have to work with.
>>> For rule based styling (the new way), you work with StyleMap and Style. For 
>>> symbolizer based styling (the old way) you work with symbolizer objects.
>>> 
>>>> Sometimes it's ok to write attributes it into style directly and in some
>>>> cases it's better to use style.styles["default"].defaultStyle.
>>> style.styles["default"].defaultStyle is not part of the API, so you should 
>>> never be working with that in an application. What you are referring to 
>>> here is just the base style on which rules will be applied to.
>>> 
>>>> Are there
>>>> some plans to change styling or limit the way to style to make it more
>>>> clearly for OL 3.0?
>>> As I said, vector styling went through a long evolution in OpenLayers 2.x, 
>>> and there are plans to give it an overhaul in 3.0. What exactly it will 
>>> look like is not clear yet, but the aim is to make it simpler. My 
>>> prediction is that rule based styling will be closer to SLD/CSS, and 
>>> styling features individually will also be possible (for the sake of KML 
>>> support).
>>> 
>>>> Something like: Every stlye attribute is a stylemap
>>>> and when it doesn't have the style you want look in it's "container"
>>>> (control)->feature->layer(or should it be feature->(control)>layer).
>>> This is exactly what you do with the StyleMap: On the layer, you have a 
>>> StyleMap which contains Style instances for all renderIntents (default, 
>>> select, temporary etc.). If you want to style a feature individually, you 
>>> create a rule with a FeatureId filter for the desired renderIntent. A 
>>> control is configured with a renderIntent, which it will use when drawing 
>>> features.
>>> 
>>>> Step 1. Let's say we have some named places in a vector layer some
>>>> chosen geometries form our data. When we load them we use the common way
>>>> to style them with StyleMap in the layer also the labels, the text is
>>>> stored in an attribute so we use ${attribName}.
>>>> Step 2. Now we want to edit the style of one feature so we have to use
>>>> the style attribute of OL.Feature.Vector, right? Because we want to
>>>> change only some attributes the layer style and not to create a new
>>>> style than we have to copy the layer (default) style into the features
>>>> style attribute before editing:
>>>> feature.style =
>>>> OpenLayers.Util.extend({},layer.style.styles["default"].defaultStyle);
>>> Nope. If you wanted to get the style that the feature is currently rendered 
>>> with, you would do
>>> 
>>> layer.styleMap.createSymbolizer(feature, "default");
>>> 
>>> But we do not want to do that here. Let's say you want to change the 
>>> fillColor of the feature, then you would create a symbolizer with it:
>>> 
>>> var symbolizer = {fillColor: "#FF32CC"};
>>> 
>>> Now you add a rule with a FeatureId filter to the Style for the "default" 
>>> renderIntent:
>>> 
>>> layer.styleMap.styles["default"].addRules([new OpenLayers.Rule({
>>>      filter: new OpenLayers.Filter.FeatureId({fids: [feature.id]}),
>>>      symbolizer: symbolizer
>>> })]);
>>> 
>>> If your features have a fid (e.g. because they came from a GML format), you 
>>> should replace "feature.id" above with "feature.fid".
>>> 
>>>> Step 2b. Because some attributes are calculated from attributes so the
>>>> attributes of feature.style are replaced by the values if there is
>>>> something like this ${attribName}. Nearly all style attributes should be
>>>> editable labels, graphics, strokes, fill, radius...
>>> If you create a FeatureId filter like above, you still can do that by using 
>>> ${whatever} in the symbolizer.
>>> 
>>>> But now we lost the ability to mark this feature as selected, it doesn't
>>>> work by the select style of the layer.
>>> If you do like described above, selecting by rendering the feature with a 
>>> "select" intent will still work, because you did not set a style property 
>>> on the feature.
>>> 
>>>> Expect we define a selectStyle in
>>>> the SelectFeature control, but this style would be same for every
>>>> feature so i.e. we cannot keep the different labels.
>>> No need to use a selectStyle in the above scenario.
>>> 
>>>> Step 3. Editing of attributes or moving features. For editing style it's
>>>> not so important to have a select style but when you use the layer with
>>>> other controls, like an attribute editor. What would we do if a user
>>>> changes in a feature with edited style the attribute for the label? We
>>>> have to read it again and put it into feature.style like in 2b.
>>> Not with the above scenario, unless you allowed the user to hard-code a new 
>>> label by setting a label property in the symbolizer.
>>> 
>>>> Step 4. Adding new features.
>>>> A user expects that he can do Step 2,3 and 4 not in the row and multiple
>>>> times.
>>> Still no problem. Add new rules with featureId filters with only the 
>>> symbolizers properties that the user has edited.
>>> 
>>>> Step 5. Now the user should be able to save the resulting map with style
>>>> and attributes. so for every edited feature we have to save the style
>>>> attribute for the others the layer.style.styles["default"].defaultStyle
>>>> or mark them as "layerStyled" and save the default Style to reuse it as
>>>> layer style the next time a user loads his layer.
>>> Nope. Just use Format.SLD to write an SLD. And the good thing is: this will 
>>> also work if your features were never rendered on the client, but by your 
>>> WMS.
>>> 
>>>> I'm looking forward for your critics, tipps and other helping things.
>>> I think there were many in my post.
>>> 
>>> Regards,
>>> Andreas.
>>> 
>>>> I'm open for questions and so on.
>>>> Thx and Regards,
>>>> Slawomir
>>>> 
>>>> -- 
>>>> -----------------------------------------------
>>>> Slawomir Messner
>>>> Forschungszentrum "Deutscher Sprachatlas"
>>>> 
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users@openlayers.org
>>>> http://openlayers.org/mailman/listinfo/users
>> 
> _______________________________________________
> Users mailing list
> Users@openlayers.org
> http://openlayers.org/mailman/listinfo/users

-- 
Andreas Hocevar
OpenGeo - http://opengeo.org/
Expert service straight from the developers.

_______________________________________________
Users mailing list
Users@openlayers.org
http://openlayers.org/mailman/listinfo/users

Reply via email to