使用Mapnik(python)仅渲染一个shapefile并过滤多个文件

时间:2019-05-07 14:21:36

标签: python shapefile mapnik

我只想基于一个shapefile(.sh)渲染2个文件:一个文件只有黄色的法国,另一个png文件,只有红色的加拿大。所有国家/地区均使用默认颜色。

我将尝试一些代码,但是它不起作用。有人可以帮我吗?这是我的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import mapnik, shapefile, sys    
LEVEL_COLUMN = 6
COUNTRY_COLUMN = 3
DEFAULT_LEVEL = 2

# SHAPES
shape_filename='ne_110m_admin_0_countries.shp'   

france_map = mapnik.Map(600, 300)
canada_map = mapnik.Map(600, 300)

countries = [
    {
    'name' : 'France',
    'obj' : france_map,
     'level' : 1
    },
    {
    'name':'Canada',
    'obj' : canada_map,
    'level' : 3
    }
]     

for country in countries:    
    sh = shapefile.Editor(shape_filename)
    sh.records

    s = mapnik.Style()
    r = mapnik.Rule()

    country.get('obj').background = mapnik.Color('steelblue')    

    for table_attributaire in sh.records:
        try:
            if table_attributaire[COUNTRY_COLUMN] == country.get('name'):
                table_attributaire[LEVEL_COLUMN] = country.get('level')
            else:
                # Others atributs to default value
                table_attributaire[LEVEL_COLUMN] = DEFAULT_LEVEL

        except KeyError as e:
            print (e)

    sh.save(shape_filename)

    polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))
    r.symbols.append(polygon_symbolizer)
    line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)
    r.symbols.append(line_symbolizer)
    s.rules.append(r)

    r.filter = mapnik.Filter("[LEVEL] = 1 ")
    symbol_level1 = mapnik.PolygonSymbolizer(mapnik.Color("yellow"))  
    r.symbols.append(symbol_level1)
    s.rules.append(r)

    r.filter = mapnik.Filter("[LEVEL] = 3")
    symbol_level2 = mapnik.PolygonSymbolizer(mapnik.Color("red"))  
    r.symbols.append(symbol_level2)
    s.rules.append(r)

    country.get('obj').append_style('My Style',s)

    ds = mapnik.Shapefile(file=shape_filename)

    layer = mapnik.Layer('world')
    layer.datasource = ds
    layer.styles.append('My Style')

    country.get('obj').layers.append(layer)

    country.get('obj').zoom_all()

    print('Render To File "{}"\n'.format('world-{}.png'.format(country.get('name'))))
    mapnik.render_to_file(country.get('obj'),'world-{}.png'.format(country.get('name')), 'png')

我已经在每个循环中查看了形状文件:值已正确更改。 对于“法国”,级别列为“ 1”(对于所有2,均为其他),对于“加拿大”,级别列为“ 3”(对于2,其他均为所有)。

遗憾的是,渲染文件相同(法国为黄色)

你能帮我吗? :)

谢谢 F。

0 个答案:

没有答案