Skip to content

Multi-valued properties

When rendering maps, it is sometimes useful to draw the same feature multiple times. For example, you might want to stroke a roads layer with a thick line and then a slimmer line of a different color to create a halo effect.

In GeoServer's css module, all properties may have multiple values. There is a distinction between complex properties, and multi-valued properties. Complex properties are separated by spaces, while multi-valued properties are separated by commas. So, this style fills a polygon once:

* {
    fill: url("path/to/img.png") red;
}

Using red as a fallback color if the image cannot be loaded. If you wanted to draw red on top of the image, you would have to style like so:

* {
    fill: url("path/to/img.png"), red;
    /* set a transparency for the second fill,
       leave the first fully opaque. */
    fill-opacity: 100%, 20%;
}

For each type of symbolizer (fill, mark, stroke, and label) the number of values determines the number of times the feature will be drawn. For example, you could create a bulls-eye effect by drawing multiple circles on top of each other with decreasing sizes:

* {
    mark: symbol(circle), symbol(circle), symbol(circle), symbol(circle);
    mark-size: 40px, 30px, 20px, 10px;
}

If you do not provide the same number of values for an auxiliary property, the list will be repeated as many times as needed to finish. So:

* {
    mark: symbol(circle), symbol(circle), symbol(circle), symbol(circle);
    mark-size: 40px, 30px, 20px, 10px;
    mark-opacity: 12%;
}

makes all those circles 12% opaque. (Note that they are all drawn on top of each other, so the center one will appear 4 times as solid as the outermost one.)

Inheritance

For purposes of inheritance/cascading, property lists are treated as indivisible units. For example:

* {
    stroke: red, green, blue;
    stroke-width: 10px, 6px, 2px;
}

[type='special'] {
    stroke: pink;
}

This style will draw the 'special' features with only one outline. It has stroke-width: 10px, 6px, 2px; so that outline will be 10px wide.