Optimizing, publishing and styling Vector data
Styling with CSS
The CSS extension module allows to build map styles using a compact, expressive styling language already well known to most web developers: Cascading Style Sheets.
The extension is available on GeoServer only. The standard CSS language has been extended to allow for map filtering and managing all the details of a map production. In this section we’ll experience creating a few simple styles with the CSS language.
Styling vector data
Creating line styles
- 
    
Go to the
mainrdlayer details page and click onEditing Tools > Style > Edit
 - 
    
Add a new
Style; selectCSSand click on the+button
 - 
    
Name it
CSS RoadsandSave
 - 
    
Edit the new style

 - 
    
Switch to
text modeand insert the followingCSS* { stroke: orange; stroke-width: 6; stroke-linecap: round; }
 - 
    
Now let’s create a cased line effect by adding a second set of colours and widths, and forcing two different
z indexesfor them. Rewrite theCSSas follows* { stroke: orange, yellow; stroke-width: 6, 2; stroke-linecap: round; z-index: 1, 2; }
Notice the two strokes of different size look like the border of a highway.
 - 
    
Let’s add a label that follows the road. Rewrite the
CSSas follows* { stroke: orange, yellow; stroke-width: 6, 2; stroke-linecap: round; z-index: 1, 2; label: [LABEL_NAME]; font-fill: black; font-family: Arial; font-size: 12; font-weight: bold; halo-color: white; halo-radius: 2; -gt-label-follow-line: true; -gt-label-group: true; -gt-label-repeat: 400; -gt-label-max-displacement: 50; }
Notice how compact is the CSS syntax versus the SLD one. It is also much more intuitive. While writing the CSS the text editor is also able to hilight typeahead hints.
 
Creating point styles
- 
    
Go to the
pointlmlayer details page and click onEditing Tools > Style > Edit
 - Add a new 
Style; selectCSSand click on the+button - 
    
Name it
CSS LandmarksandSave
 - Edit the new style
 - 
    
Switch to
text modeand insert the followingCSS* { mark: symbol('circle'); mark-size: 5; }
 - 
    
Let’s change the color of the points by specifying a
fill. If we specified afillin the top level rule it would be interpreted as a polygonal fill, to express that we want to fill inside the marks we have to create a new rule with the:markpseudo-selector* { mark: symbol('circle'); mark-size: 5; } :mark { fill: cyan; stroke: darkblue; }
 - 
    
Finally, let’s override the default styling for all shopping centers. Shopping centers are not easy to find, they have a
MTFCCcategory value equal toC3081and containShoppingin the name.* { mark: symbol('circle'); mark-size: 5; } :mark { fill: cyan; stroke: darkblue; } [MTFCC = 'C3081' AND FULLNAME LIKE '%Shopping%'] { mark: url("./img/landmarks/shop_supermarket.p.16.png"); mark-size: 16; }
 
Creating polygon styles
- 
    
As
test_user1, upload a theESRI Shapefilenamedne_50m_admin_0_countriesfrom the folder/opt/data/sample_data/user_data
 - 
    
Add a new
CSSstyle to the new layer namesCSS Population
 - 
    
We want to create a simple 3 class thematic map based on the country population, stored in the
POP_ESTattribute[POP_EST < 10000000] { fill: lightgrey; } [POP_EST >= 10000000 AND POP_EST < 50000000] { fill: olive; } [POP_EST > 50000000] { fill: salmon }
 - 
    
Let’s also add a very thin black border around all polygons, regardless of their population, using the
* selector[POP_EST < 10000000] { fill: lightgrey; } [POP_EST >= 10000000 AND POP_EST < 50000000] { fill: olive; } [POP_EST > 50000000] { fill: salmon } * { stroke: black; stroke-width: 0.2; }
 
Patterns and Hatches
- 
    
Upload the
ESRI Shapefilenamedtl_2010_08013_arealmfrom the folder/opt/data/sample_data/pretty_maps/data/boulder
 - 
    
Create a new
CSSstyle namedCSS Area Landmarksfor thetl_2010_08013_arealmlayer
 - 
    
Switch to the
texteditor insert the followingCSS[MTFCC='K2582'] [@scale < 500000] { fill: url(./img/landmarks/area/grave_yard.png); fill-mime: 'image/png'; }
_The above CSS defines a
with a pointing to a png ./img/landmarks/area/grave_yard.png in the GeoServer data directory, which will be used by GeoServer as pattern to fill the polygon._  - 
    
The previous example uses a
pngas fill pattern; the next one uses afont characterinstead[MTFCC='K2582'] [@scale < 500000] { fill: #D3FFD3, symbol('ttf://Wingdings#0x0055'); fill-size: 16; fill-opacity: 0.5, 1.0; stroke: #6DB26D; -gt-graphic-margin: 8; :nth-symbol(2) { stroke: #6DB26D; } }
 - Let’s now take a look at another way to fill polygons using patterns, the 
Hatches. - 
    
Edit the styles of the GeoNode layer
Wetlands_regulatory_areas
 - 
    
Create a new
CSSstyle and name itCSS Regulatory Area
 - 
    
Insert the following
CSS[@scale < 10000] { fill: symbol('shape://times'); fill-size: 8; :nth-symbol(1) { stroke: #ADD8E6; stroke-width: 1.0; }; }
On the previous example we used times as hatches mark. GeoServer makes available different kinds of hatches marks:

 
Dashes
Lets now familiarize a bit with Dashes. We are going to see how it’s possible to draw several kind of dashes to represent different types of trails or roads.
- 
    
Edit the styles of the GeoNode layer
Trails
 - 
    
Create a new
CSSstyle and name itCSS Trails
 - 
    
Insert the following
CSS[@scale < 75000] { stroke: #6B4900; stroke-width: 0.1; stroke-dasharray: 2.0; }
 - 
    
Encodes a dash pattern as a series of numbers separated by spaces. Odd-indexed numbers (first, third, etc) determine the length in pxiels to draw the line, and even-indexed numbers (second, fourth, etc) determine the length in pixels to blank out the line. Default is an unbroken line. Starting from version 2.1 dash arrays can be combined with graphic strokes to generate complex line styles with alternating symbols or a mix of lines and symbols.
 - 
    
Insert the following
CSS[@scale < 75000] { stroke: #AA0000, symbol(circle); stroke-dasharray: 10 14, 6 18; stroke-dashoffset: 14, 0; :nth-symbol(2) { size: 6; fill: #AA0000; } }
We may notice two interesting things in this style, two
<LineSymbolizer>the first one defining a circleMarkwith a simpledasharrayand the second one a simple stroke defining also adashoffset. The latter specifies the distance in pixels into the dasharray pattern at which to start drawing. Default is0.