Mapnik提供了两种绘制线状要素的方法: LineSymbolizer 和LinePatternSymbolizer。让我们依次来看一看:
import mapnik
symbolizer = mapnik.LineSymbolizer()
symbolizer.stroke = mapnik.Color("#008000")
symbolizer.stroke_width = 1.0
LineSymbolizer使用Mapnik的 Stroke
对象来定义绘制线。
为了使用LineSymbolizer,首先你需要创建stroke对象和绘制线形的各种选项。
然后,可以创建 LineSymbolizer
,传递 stroke
对象到 LineSymbolizer
的构造器中。
让我们来更仔细的看一下由stroke对象提供的绘制线型的各种选项。
默认情况下,线将会被绘制成黑色。你可以通过设置 stroke
的 color
属性到Mapnik的颜色对象中来改变颜色。
stroke.color = mapnik.Color("red")
在默认情况下,LineSymbolizer绘制的线有一个像元的宽。 你可以设置stroke的width属性改变线的宽度;你也可以通过设置stroke的opacity属性改变线的透明程度:
stroke.width = 1.5
stroke.opacity = 0.8
注意:你可以通过改变微小的线的宽度来对你的线的宽度进行细粒度的控制。
透明度的范围是从0.0(完全透明)到1.0(完全不透明)。如果没有定义透明度,则线将会完全不透明。
line_cap
定义的是绘制线的结尾。Mapnik支持三种水平的line_cap
的设置。
默认情况下,线会使用BUTT_CAP
格式,但是你可以通过设置stroke
的line_cap
属性来改变这种状况,例如:
stroke1.line_cap = mapnik.line_cap.BUTT_CAP
stroke2.line_cap = mapnik.line_cap.ROUND_CAP
stroke3.line_cap = mapnik.line_cap.SQUARE_CAP
下面看一下实例:
roadEdgeSymbolizer = mapnik.LineSymbolizer()
roadEdgeSymbolizer.stroke = mapnik.Color("#bf7a3a")
roadEdgeSymbolizer.stroke_width = 7
roadInteriorSymbolizer = mapnik.LineSymbolizer()
roadInteriorSymbolizer.stroke = mapnik.Color("#ffd3a9")
roadInteriorSymbolizer.stroke_width = 6
m = mapnik.Map(600, 300, "+proj=latlong +datum=WGS84")
# m.background = mapnik.Color('steelblue')
s = mapnik.Style()
r = mapnik.Rule()
r.symbols.append(roadEdgeSymbolizer)
s.rules.append(r)
m.append_style('My Style', s)
lyr = mapnik.Layer('world', "+proj=latlong +datum=WGS84")
lyr.datasource = mapnik.Shapefile(file='/data/gdata/GSHHS_c.shp')
lyr.styles.append('My Style')
m.layers.append(lyr)
m.zoom_all()
mapnik.render_to_file(m, 'xx_line_kz.png', 'png')
上面生成的结果为:
from IPython.display import Image
Image('./xx_line_kz.png')
stylesheet = 'test_fig_line_cap.xml'
# image = 'xx_world_style_from_xml.png'
m = mapnik.Map(600, 300)
mapnik.load_map(m, stylesheet)
m.zoom_all()
# m.background = mapnik.Color('steelblue')
# bbox = mapnik.Box2d(118, 36.6, 124.6, 40.7)
bbox = mapnik.Box2d(-1, -1, 25, 1)
m.zoom_to_box(bbox)
mapnik.render_to_file(m, 'xx_outfile.png')
stylesheet = 'test_fig_line_dash.xml'
# image = 'xx_world_style_from_xml.png'
m = mapnik.Map(600, 300)
mapnik.load_map(m, stylesheet)
m.zoom_all()
# m.background = mapnik.Color('steelblue')
# bbox = mapnik.Box2d(118, 36.6, 124.6, 40.7)
bbox = mapnik.Box2d(-1, -1, 25, 1)
m.zoom_to_box(bbox)
mapnik.render_to_file(m, 'xx_fig_line_dash.png')
Image('xx_fig_line_dash.png')
另一个实例:
stylesheet = '/data/gdata/world_map_dash.xml'
m = mapnik.Map(600, 300)
mapnik.load_map(m, stylesheet)
m.zoom_all()
bbox = mapnik.Box2d(118, 36.6, 124.6, 40.7)
m.zoom_to_box(bbox)
mapnik.render_to_file(m, 'xx_line_jv.png', 'png')
Image('xx_line_jv.png')
stylesheet = 'test_fig_line_join.xml'
# image = 'xx_world_style_from_xml.png'
m = mapnik.Map(600, 300)
mapnik.load_map(m, stylesheet)
m.zoom_all()
# m.background = mapnik.Color('steelblue')
# bbox = mapnik.Box2d(118, 36.6, 124.6, 40.7)
bbox = mapnik.Box2d(-1, -1, 25, 1)
m.zoom_to_box(bbox)
mapnik.render_to_file(m, 'xx_fig_line_join.png')
Image('xx_fig_line_join.png')