User:Moresby/Understanding Mapnik/Specifying line colour and width

From OpenStreetMap Wiki
Jump to: navigation, search
Understanding Mapnik
A Mapnik tutorial
Starting with Python
Using XML and CSS
CartoCSS and PostGIS
031-lines-colour.png - roads shown with coloured lines

Se far we have drawn lines using just the default settings: solid black lines one pixel wide. We can choose the colour and width of our lines relatively easily by specifying these when we create our LineSymbolizer.

 1 #!/usr/bin/python
 2 
 3 # Load the Python mapnik libraries.
 4 import mapnik
 5 
 6 # Create a new map.
 7 m = mapnik.Map(480, 320)
 8 
 9 # Set the background colour.
10 m.background = mapnik.Color('ghostwhite')
11 
12 # Create a line symbolizer.
13 line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('green'), 2)
14 
15 # Create a new rule and add the symbolizer.
16 r = mapnik.Rule()
17 r.symbols.append(line_symbolizer)
18 
19 # Create a new style and add the rule.
20 s = mapnik.Style()
21 s.rules.append(r)
22 
23 # Add the style to the map.
24 m.append_style('basic_style', s)
25 
26 # Specify that our data is coming from a CSV file called "data-roads.csv".
27 ds = mapnik.CSV(file='data-roads.csv')
28 
29 # Create a new layer for the map, called "main_map" and add the data
30 #   source and style to that layer.
31 l = mapnik.Layer('main_map')
32 l.datasource = ds
33 l.styles.append('basic_style')
34 
35 # Add the layer to the map.
36 m.layers.append(l)
37 
38 # Zoom to the part of the map we are interested in.
39 m.zoom_to_box(mapnik.Box2d(0, 0, 480, 320))
40 
41 # Save the map as a PNG image.
42 mapnik.render_to_file(m, '031-lines-colour.png', 'png')

Save this program in a file called 031-lines-colour.py and run it by typing:

python 031-lines-colour.py

You should see no error messages, and you should see a new file in your working directory called 031-lines-colour.png. This is a new map image, and should be a light-coloured rectangle 480 pixels wide by 320 pixels high, with a series of interconnected green lines, as shown above.