1.使用XML配置文件
2.使用Python bindings
3.使用C++中的API
这里我们先介绍第二种Python bindings,并采用这种方式做一个Demo。
mapnik-config -v
如果安装成功,输入完上面的命令回车后,会显示mapnik的版本
python -c "import mapnik;print mapnik.__file__"
我的显示 D:\01software\Java\mapnik-v2.2.0\python\2.7\site-packages\mapnik__init__.pyc
从以下地址下载shapefile,这是world border polygons。
https://github.com/mapnik/mapnik/wiki/data/110m-admin-0-countries.zip
下载之后解压,会出现四个文件
ne_110m_admin_0_countries.shp
ne_110m_admin_0_countries.shx
ne_110m_admin_0_countries.dbf
ne_110m_admin_0_countries.prj
我在D:\01software\Java\mapnik-v2.2.0文件夹下建立了一个shapefile文件夹,然后里面放解压后的110m-admin-0-countries文件夹。
一会我们就要用到ne_110m_admin_0_countries.shp作为数据源。如果你想知道它长什么样,可以用QGIS软件将它打开。
本来的shapefile如图所示,现在我们用mapnik渲染出不一样的‘世界’。
在ne_110m_admin_0_countries.shp所在的文件夹下,打开命令窗口,输入python,进入python解释器。
引入mapnik模块
import mapnik
定义一个地图,变量为m,地图的背景色为steelblue
m = mapnik.Map(600,300)
m.background = mapnik.Color('steelblue')
定义样式s和规则r
s = mapnik.Style()
r = mapnik.Rule()
定义多边形符号polygon_symbolizer
地图上的多边形填充上#f2eff9
并把符号绑定在规则r上
polygon_symbolizer = mapnik.PolygonSymbolizer()
polygon_symbolizer.fill = mapnik.Color('#f2eff9')
r.symbols.append(polygon_symbolizer)
定义线符号line_symbolizer,颜色为rgb(50%,50%,50%),宽度为0.1
同样把这个符号绑定在规则r上
line_symbolizer = mapnik.LineSymbolizer()
line_symbolizer.stroke_color = mapnik.Color('rgb(50%,50%,50%)')
line_symbolizer.stroke_width = 0.1
r.symbols.append(line_symbolizer)
把规则绑定在样式上
s.rules.append(r)
把样式命名为‘My Style’绑定在map上
m.append_style('My Style',s)
定义数据源(后面的路径使用的是相对路径,因为我命令窗口就是在这个文件所在的文件夹打开的,所以路径如下所示,也可以使用绝对路径,但是我没尝试成功)
ds = mapnik.Shapefile(file='ne_110m_admin_0_countries.shp')
定义layer,将layer绑定数据源和样式
layer = mapnik.Layer('world')
layer.datasource = ds
layer.styles.append('My Style')
把layer绑定到map上,并放大
m.layers.append(layer)
m.zoom_all()
mapnik.render_to_file(m,'world.png', 'png')
print "rendered image to 'world.png'"
然后打开world.png
我们也可以在ne_110m_admin_0_countries.shp所在的文件夹建立world.py 文件,然后用Editplus将文件打开,一起粘下如下代码,然后保存。并在此文件夹下打开命令窗口,执行
python world.py
就会重写world.png。 你可以修改其中的颜色值来重写world.png看效果。
import mapnik
m = mapnik.Map(600,300)
m.background = mapnik.Color('steelblue')
s = mapnik.Style()
r = mapnik.Rule()
polygon_symbolizer = mapnik.PolygonSymbolizer()
polygon_symbolizer.fill = mapnik.Color('#f2eff9')
r.symbols.append(polygon_symbolizer)
line_symbolizer = mapnik.LineSymbolizer()
line_symbolizer.stroke_color = mapnik.Color('rgb(50%, 50%, 50%)')
line_symbolizer.stroke_width = 1
r.symbols.append(line_symbolizer)
s.rules.append(r)
m.append_style('My Style',s)
ds = mapnik.Shapefile(file='ne_110m_admin_0_countries.shp')
layer = mapnik.Layer('world')
layer.datasource = ds
layer.styles.append('My Style')
m.layers.append(layer)
m.zoom_all()
mapnik.render_to_file(m,'world.png', 'png')
print "rendered image to 'world.png'"
Map—Layer—Style—Rule—symbols(从右向左依次渲染,但是需要先定义Map)
Layer—datasource
Layer—Style
经过了这个Demo,初步了解了mapnik做的事情,但是还不是很明白,继续学习……
line_symbolizer表示的是地图上线条的样式,但是line_symbolizer.stroke_color并不能改变颜色值,而直接用line_symbolizer.stroke又会报错,还不知道什么原因。下篇文章用xml形式的style文件不会出现这个问题。
https://github.com/mapnik/mapnik/wiki/GettingStartedInPython