Рендеринг нескольких файлов только с одним шейп-файлом и фильтрацией с помощью Mapnik (python) - PullRequest
0 голосов
/ 07 мая 2019

Я хочу визуализировать 2 файла, основываясь только на одном шейп-файле (.sh): один файл содержит только Францию ​​желтого цвета, а другой файл 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.

...