def renderit(line_sym=None, poly_sym=None, point_sym=None, shpfile=None, fig_index=0):
m = mapnik.Map(600, 300, "+proj=latlong +datum=WGS84")
s = mapnik.Style()
r = mapnik.Rule()
if poly_sym:
r.symbols.append(poly_sym)
if point_sym:
r.symbols.append(point_sym)
if line_sym:
r.symbols.append(line_sym)
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/world_borders.shp')
if shpfile:
lyr.datasource = mapnik.Shapefile(file=shpfile)
else:
lyr.datasource = mapnik.Shapefile(file=os.path.join(BASE_PATH, 'fig_data_line.shp'))
lyr.styles.append('My Style')
m.layers.append(lyr)
# bbox = mapnik.Box2d(118, 36.6, 124.6, 40.7)
# m.zoom_to_box(bbox)
m.zoom_all()
return m
import os, mapnik
shpfile='/data/gdata/fig_data/fig_data_poly.shp'
ply_sym = mapnik.PolygonSymbolizer()
ply_sym.fill = mapnik.Color('#f2eff9')
li_sym = mapnik.LineSymbolizer()
pt_sym = mapnik.PointSymbolizer()
m = renderit(point_sym=pt_sym, line_sym=li_sym,
poly_sym=ply_sym,shpfile=shpfile)
m.zoom_all()
mapnik.render_to_file(m, 'xx_sym.png')
可以为图片文件提供名称、类型、尺寸,PointSymbolizer将使用这些特征绘制每个点。
需要知道的是PointSymbolizer绘制影像会覆盖到你所想要的点上。 可能需要在影片的周围留白(或者透明) ,这样影像中你想要的部分就会出现在你想要的点上。 例如,如果你希望在一个确切的位置绘制一根针脚,你可能需要设置格式。
额外的(透明的)空白确保针脚的点位于图像的中央,使影像正好在地图所需的位置上。
无论你是否提供影像,PointSymbolizer都有两个用来修正行为的属性:
symbolizer.allow_overlap = True
:如果你将这个属性设置成True
,即使影像重叠,所有的点都将会被绘制。缺省情况下不会重叠。symbolizer.opacity = 0.75
:透明或者不透明怎样来绘制影像。值为0.0
,则绘制的影像是完全透明的,而值为1.0
(默认情况下),则绘制的影像是完全不透明的。
ShieldSymbolizer
ShieldSymbolizer允许你绘制标记,并将文本与图片结合。 在本章节中,我们将会着眼于ShieldSymbolizer绘制点。 ShieldSymbolize绘制的是一个和文本标记相关的影像:
ShieldSymbolizer
与 TextSymbolizer
和 PointSymbolizer
在呈现相同的数据时具有相同的工作方式。
仅有的不同就是 ShieldSymbolizer
确保文本和影像呈现在一起;
你永远也得不到一个没有文本的影像,或者反之亦然。
当你创建一个 ShieldSymbolizer
,你需要提供较多的参数。
symbolizer = mapnik.ShieldSymbolizer( fieldName, font, fontSize, color,
imageFile, imageFormat, imageWidth, imageHeight)
其中:
fieldName
是作为文本字段所要显示的字段或者属性的名称。font
是绘制文本所使用的字型名称。fontSize
是文本的尺寸的,以点数为单位。color
是Mapnik颜色对象定义用来绘制文本的颜色。imageFile
是掌握显示影像的文件的名字(和可选的路径)imageFormat
是定义图像文件格式的字符串(PNG or TIFF)imageWidth
是该影像文件的宽度,以像元为单位。imageHeight
是影像文件的高度,以像元为单位。
因为ShieldSymbolizer
是TextSymbolizer
的一个子类,
所有TextSymbolizer
可以利用的定位和格式的选项同样对ShieldSymbolizer
也有用。
由于,他也绘制一个影像,一个ShieldSymbolizer
同样拥有PointSymbolize
的allow_overlap
和opacity属性。
请注意你可能需要调用ShieldSymbolizer
的displacement()
方法来正确的定位文本,
若在默认情况下文本直接出现在点上,即图像的中央。
import mapnik
import os
stylesheet = 'test_fig_poly_shield.xml'
m = mapnik.Map(600, 200)
mapnik.load_map(m, stylesheet)
m.zoom_all()
# env = m.envelope()
# print(env)
# box = mapnik.Box2d(env.minx - .1, env.miny - .3, env.maxx + .3, env.maxy + .3)
# m.zoom_to_box(box)
mapnik.render_to_file(m, 'xx_test_fig_poly_shield.png')
查看结果 :