<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Ok, I've one...two questions.<br>
    When I shouldn't use <br>
    <pre wrap="">style.styles["default"].defaultStyle["attribName"]

</pre>
    then how can I change ..let's say fontSize... for the whole layer?
    Create a new Style and replace the old one?<br>
    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:<br>
    <title>Snippet</title>
    <pre style="font-family: consolas;"><span style="color: blue;">...
var</span>&nbsp;defaultStyle&nbsp;= OpenLayers.Util.applyDefaults({&nbsp;<span style="color: maroon;">'pointRadius'</span>:&nbsp;5,&nbsp;<span style="color: maroon;">'fillColor'</span>:&nbsp;<span style="color: maroon;">'#123456'</span>,&nbsp;<span style="color: maroon;">'fillOpacity'</span>:&nbsp;0.6,&nbsp;<span style="color: maroon;">'stroke'</span>:&nbsp;<span style="color: blue;">true</span>,&nbsp;<span style="color: maroon;">'strokeColor'</span>:&nbsp;<span style="color: maroon;">'#654321'</span>,&nbsp;<span style="color: maroon;">'strokeOpacity'</span>:&nbsp;1,&nbsp;<span style="color: maroon;">'strokeWidth'</span>:&nbsp;1,&nbsp;<span style="color: maroon;">'strokeDashstyle'</span>:&nbsp;<span style="color: maroon;">'solid'</span>,&nbsp;<span style="color: maroon;">"label"</span>:&nbsp;<span style="color: maroon;">"${getName}"</span>,&nbsp;<span style="color: maroon;">'fontFamily'</span>:&nbsp;<span style="color: maroon;">'TeuthoBD'</span>,&nbsp;<span style="color: mar
oon;">"fontWeight"</span>:&nbsp;<span style="color: maroon;">"bold"</span>,&nbsp;<span style="color: maroon;">"fontSize"</span>:&nbsp;<span style="color: maroon;">"${getFontSize}"</span>,&nbsp;<span style="color: maroon;">"fontColor"</span>:&nbsp;<span style="color: maroon;">"#000000"</span>,&nbsp;<span style="color: maroon;">"labelAlign"</span>:&nbsp;<span style="color: maroon;">"lt"</span>&nbsp;}, OpenLayers.Feature.Vector.style["default"])<span style="color: blue;">;
var</span>&nbsp;selectStyle&nbsp;= OpenLayers.Util.applyDefaults({&nbsp;<span style="color: maroon;">'pointRadius'</span>: 6,&nbsp;<span style="color: maroon;">'fillColor'</span>:&nbsp;<span style="color: maroon;">'#123456'</span>,&nbsp;<span style="color: maroon;">'fillOpacity'</span>:&nbsp;0.8,&nbsp;<span style="color: maroon;">'stroke'</span>:&nbsp;<span style="color: blue;">true</span>,&nbsp;<span style="color: maroon;">'strokeColor'</span>:&nbsp;<span style="color: maroon;">'#654321'</span>,&nbsp;<span style="color: maroon;">'strokeOpacity'</span>:&nbsp;1,&nbsp;<span style="color: maroon;">'strokeWidth'</span>:&nbsp;1,&nbsp;<span style="color: maroon;">'strokeDashstyle'</span>:&nbsp;<span style="color: maroon;">'solid'</span>,&nbsp;<span style="color: maroon;">"label"</span>:&nbsp;<span style="color: maroon;">"${getName}"</span>,&nbsp;<span style="color: maroon;">'fontFamily'</span>:&nbsp;<span style="color: maroon;">'TeuthoBD'</span>,&nbsp;<span style="color: maroon;">
"fontWeight"</span>:&nbsp;<span style="color: maroon;">"bold"</span>,&nbsp;<span style="color: maroon;">"fontSize"</span>:&nbsp;<span style="color: maroon;">"${getFontSize}"</span>,&nbsp;<span style="color: maroon;">"fontColor"</span>:&nbsp;<span style="color: maroon;">"#000000"</span>,&nbsp;<span style="color: maroon;">"labelAlign"</span>:&nbsp;<span style="color: maroon;">"lt"</span>&nbsp;}, OpenLayers.Feature.Vector.style["default"])<span style="color: blue;">;</span><span style="color: blue;">var</span>&nbsp;layerStyleMap&nbsp;=&nbsp;<span style="color: blue;">new</span>&nbsp;OpenLayers.StyleMap({&nbsp;<span style="color: maroon;">'default'</span>:&nbsp;defaultStyle,&nbsp;<span style="color: maroon;">'select'</span>:&nbsp;selectStyle&nbsp;});
layerStyleMap.styles[<span style="color: maroon;">"default"</span>].context&nbsp;=&nbsp;{&nbsp;getName:&nbsp;userContext.labelFunction,&nbsp;getFontSize:&nbsp;userContext.labelSize&nbsp;};
layerStyleMap.styles[<span style="color: maroon;">"select"</span>].context&nbsp;=&nbsp;{&nbsp;getName:&nbsp;userContext.labelFunction,&nbsp;getFontSize:&nbsp;userContext.labelSize&nbsp;};
userContext.paintLayer&nbsp;=&nbsp;<span style="color: blue;">new</span>&nbsp;OpenLayers.Layer.Vector(<span style="color: maroon;">"BayDat"</span>,&nbsp;{&nbsp;styleMap:&nbsp;layerStyleMap});
userContext.map.addLayer(userContext.paintLayer);</pre>
    ....<br>
    <title>Snippet</title>
    <pre style="font-family: consolas;">&nbsp;&nbsp;&nbsp;&nbsp;labelSize:&nbsp;<span style="color: blue;">function</span>&nbsp;(feature)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">return</span>&nbsp;Math.min(20,&nbsp;Math.max(5,&nbsp;6000&nbsp;/&nbsp;feature.layer.map.getResolution()))&nbsp;+&nbsp;<span style="color: maroon;">"px"</span>;
&nbsp;&nbsp;&nbsp;&nbsp;},
 
&nbsp;&nbsp;&nbsp;&nbsp;labelFunction:&nbsp;<span style="color: blue;">function</span>&nbsp;(feature)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">if</span>&nbsp;(feature.attributes.value&nbsp;!=&nbsp;undefined)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">return</span>&nbsp;feature.attributes.value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: blue;">else</span>&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">return</span>&nbsp;<span style="color: maroon;">''</span>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;},</pre>
    Regards,<br>
    Slawomir<br>
    <br>
    Am 27.08.2010 10:17, schrieb Slawomir Messner:
    <blockquote cite="mid:4C77749E.1010505@staff.uni-marburg.de"
      type="cite">
      <pre wrap="">  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:
</pre>
      <blockquote type="cite">
        <pre wrap="">On Aug 27, 2010, at 07:52 , Slawomir Messner wrote:

</pre>
        <blockquote type="cite">
          <pre wrap="">1. Is this the recommended way to work with styles or is there a better
way? Is there maybe already a tool?
</pre>
        </blockquote>
        <pre wrap="">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 <a class="moz-txt-link-freetext" href="http://trac.openlayers.org/wiki/Styles">http://trac.openlayers.org/wiki/Styles</a>. This is all about rule based styling.

If you want to use a tool, you can go through SLD (see <a class="moz-txt-link-freetext" href="http://openlayers.org/dev/examples/sld.html">http://openlayers.org/dev/examples/sld.html</a>) 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 (<a class="moz-txt-link-freetext" href="http://opengeo.org/products/suite/">http://opengeo.org/products/suite/</a>)
  * Desktop GIS: UDig (<a class="moz-txt-link-freetext" href="http://udig.refractions.net/">http://udig.refractions.net/</a>)
  * If you are familiar with CSS, you can try GeoServer CSS (<a class="moz-txt-link-freetext" href="http://dwins.wordpress.com/2010/07/25/geoserver-css-conversion/">http://dwins.wordpress.com/2010/07/25/geoserver-css-conversion/</a>)

</pre>
        <blockquote type="cite">
          <pre wrap="">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.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">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.
</pre>
        </blockquote>
        <pre wrap="">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).

</pre>
        <blockquote type="cite">
          <pre wrap="">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?
</pre>
        </blockquote>
        <pre wrap="">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).

</pre>
        <blockquote type="cite">
          <pre wrap="">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'} }.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">3. StyleMap, Style and Object are the classes you have to work with.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">Sometimes it's ok to write attributes it into style directly and in some
cases it's better to use style.styles["default"].defaultStyle.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">Are there
some plans to change styling or limit the way to style to make it more
clearly for OL 3.0?
</pre>
        </blockquote>
        <pre wrap="">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).

</pre>
        <blockquote type="cite">
          <pre wrap="">Something like: Every stlye attribute is a stylemap
and when it doesn't have the style you want look in it's "container"
(control)-&gt;feature-&gt;layer(or should it be feature-&gt;(control)&gt;layer).
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">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);
</pre>
        </blockquote>
        <pre wrap="">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".

</pre>
        <blockquote type="cite">
          <pre wrap="">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...
</pre>
        </blockquote>
        <pre wrap="">If you create a FeatureId filter like above, you still can do that by using ${whatever} in the symbolizer.

</pre>
        <blockquote type="cite">
          <pre wrap="">But now we lost the ability to mark this feature as selected, it doesn't
work by the select style of the layer.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">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.
</pre>
        </blockquote>
        <pre wrap="">No need to use a selectStyle in the above scenario.

</pre>
        <blockquote type="cite">
          <pre wrap="">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.
</pre>
        </blockquote>
        <pre wrap="">Not with the above scenario, unless you allowed the user to hard-code a new label by setting a label property in the symbolizer.

</pre>
        <blockquote type="cite">
          <pre wrap="">Step 4. Adding new features.
A user expects that he can do Step 2,3 and 4 not in the row and multiple
times.
</pre>
        </blockquote>
        <pre wrap="">Still no problem. Add new rules with featureId filters with only the symbolizers properties that the user has edited.

</pre>
        <blockquote type="cite">
          <pre wrap="">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.
</pre>
        </blockquote>
        <pre wrap="">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.

</pre>
        <blockquote type="cite">
          <pre wrap="">I'm looking forward for your critics, tipps and other helping things.
</pre>
        </blockquote>
        <pre wrap="">I think there were many in my post.

Regards,
Andreas.

</pre>
        <blockquote type="cite">
          <pre wrap="">I'm open for questions and so on.
Thx and Regards,
Slawomir

-- 
-----------------------------------------------
Slawomir Messner
Forschungszentrum "Deutscher Sprachatlas"

_______________________________________________
Users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Users@openlayers.org">Users@openlayers.org</a>
<a class="moz-txt-link-freetext" href="http://openlayers.org/mailman/listinfo/users">http://openlayers.org/mailman/listinfo/users</a>
</pre>
        </blockquote>
      </blockquote>
      <pre wrap="">
</pre>
    </blockquote>
  </body>
</html>