【GIS】——使用Python bindings操作mapnik

背景介绍

使用mapnik有三种方式:

1.使用XML配置文件
2.使用Python bindings
3.使用C++中的API

这里我们先介绍第二种Python bindings,并采用这种方式做一个Demo。

步骤:

1.检查mapnik是否安装成功

mapnik-config -v

如果安装成功,输入完上面的命令回车后,会显示mapnik的版本

2.检查Python bindings

python -c "import mapnik;print mapnik.__file__"

我的显示 D:\01software\Java\mapnik-v2.2.0\python\2.7\site-packages\mapnik__init__.pyc

3.准备数据

从以下地址下载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软件将它打开。

【GIS】——使用Python bindings操作mapnik_第1张图片


【GIS】——使用Python bindings操作mapnik_第2张图片


【GIS】——使用Python bindings操作mapnik_第3张图片

本来的shapefile如图所示,现在我们用mapnik渲染出不一样的‘世界’。

4.编写python代码

在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

【GIS】——使用Python bindings操作mapnik_第4张图片

(可选)简练world.py

我们也可以在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

你可能感兴趣的:(▶【GIS】)