python操作多个图层的mapnik

来源:互联网 发布:mysql 数据库安全模式 编辑:程序博客网 时间:2024/05/22 11:33

操作单个图层的见之前的文章

vc调用python接口操作mapnik

0.准备工作

1.见之前的文章
2.中国地图包(文件夹里CHN_adm0为国界,CHN_adm1为省界,CHN_adm2为市界)

1.流程

1.新建map
2.创建新图层,包括数据源、样式和规则
3.添加新图层的样式、规则
4.向地图添加刚创建的图层
5.重复2-4步骤添加其他图层
6.渲染到文件

注意:mapnik采用的“画家规则”,即最后添加的图层覆盖之前添加的图层。

2.Python代码

import mapnik#----------create map---------------------m = mapnik.Map(800,600);m.background = mapnik.Color('steelblue');#----------create layer 1-----------------Boundries_layer = mapnik.Layer('Boundries');#----------create layer 1 datasource------Boundries_layer.datasource = mapnik.Shapefile(file='C:\mapnik-v2.2.0\demo\map\CHN_adm0.shp');#----------get layer 1 style & rule------Boundries_style = mapnik.Style();Boundries_rule = mapnik.Rule();#----------set layer 1 Polygon & Line color------Boundries_rule.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9')));Boundries_rule.symbols.append(mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1));#----------set layer 1 style & rule------Boundries_style.rules.append(Boundries_rule);#----------append layer 1 style----------m.append_style('Boundries Style',Boundries_style);Boundries_layer.styles.append('Boundries Style');#----------append layer1 to map----------m.layers.append(Boundries_layer);#----------create layer 2-----------------Province_layer = mapnik.Layer('Province');#----------create layer 2 datasource------Province_layer.datasource = mapnik.Shapefile(file='C:\mapnik-v2.2.0\demo\map\CHN_adm2.shp');#----------get layer 2 style & rule-------Province_style = mapnik.Style();Province_rule = mapnik.Rule();#----------set layer 2 Line color---------Province_rule.symbols.append(mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1));Province_style.rules.append(Province_rule);m.append_style('Province Style',Province_style);Province_layer.styles.append('Province Style');#----------append layer 2 to map----------m.layers.append(Province_layer);#----------create layer 3-----------------City_layer = mapnik.Layer('City');#----------create layer 3 datasource------City_layer.datasource = mapnik.Shapefile(file='C:\mapnik-v2.2.0\demo\map\CHN_adm1.shp');#----------get layer 3 style & rule-------City_style = mapnik.Style();City_rule = mapnik.Rule();#----------set layer 3 Line color---------City_rule.symbols.append(mapnik.LineSymbolizer(mapnik.Color('#ea5506'),0.5));City_style.rules.append(City_rule);m.append_style('City Style',City_style);City_layer.styles.append('City Style');#----------append layer 3 to map----------m.layers.append(City_layer);m.zoom_all();mapnik.render_to_file(m,"CHN_0+1+2.png", 'png');

3.得到结果图片

3层渲染结果

4.特殊说明

1.city图层边界包含有province边界。
2.图层province和city所指向的文件本来应该分别对应CHN_adm1和CHN_adm2,但这样的话后渲染的city图层曲线将会覆盖掉之前画的province图层,因此代码里改了顺序,先渲染city曲线,再渲染province曲线,这样就能看清楚province边界了。

0 0
原创粉丝点击