Hi Roger,

Here is my guess...

Styles (and Rules) are only evaluated at mapnik.render(), so remove_style() and 
append_style() do nothing at run time, just the last one, as you explain, will 
have some effect.

# No-warranty snippet ;)

# Create just one style
s = mapnik.Style()

 for feature in PosQuery:
            ....
            r = mapnik.Rule()
            ....
            # Keep adding different rules to the style
            s.rules.append(r)
            # m.remove_style('selected')

# append the style once (outside the loop)
m.append_style('selected',s)


Good luck!

Manel


________________________________
De: [email protected] 
[mailto:[email protected]] En nombre de Roger Barrette
Enviado el: jueves, 09 de junio de 2011 19:59
Para: [email protected]
Asunto: [Mapnik-users] Problem appending multiple symbols to map

Hi all,  I just started working with Mapnik the other day.  I have taken one of 
the demos and modified it in an attempt to iterate through a database of 
country names, and then simply change their color to red if they are present in 
the table.  the problem is that, although it appears to iterate through all of 
the countries, the only one that gets 'labeled red' is the last on in the loop. 
 The code is as follows:

 (Select some data from a mysql database....)

    MappingLines = cursorM.fetchall()
    m = mapnik.Map(800,300)
    mapnik.load_map(m,'c:\\IVVSL\\Results\\populationb.xml')

    countries = m.layers[0]
    ds = countries.datasource
    countries.styles.append('selected')
    featureset = ds.all_features()
    PosQuery = []
    for Mline in MappingLines:

        critFilter = ("[NAME] = '%s'")%Mline[1]
        criteria = mapnik.Filter(critFilter)

        queryset = [f for f in featureset if criteria.passes(f)]
        try:
            PosQuery.append(queryset[0])
        except:
            continue

    for feature in PosQuery:
            m.zoom_to_box(feature.envelope())
            m.zoom(1)
            name = str(feature.attributes['NAME'])

            print 'Matched %s...' % name
            feature_filter = mapnik.Filter("[NAME] = '%s'" % name)

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

            
r.symbols.append(mapnik.LineSymbolizer(mapnik.Color('darkorange'),3))
            r.symbols.append(mapnik.LineSymbolizer(mapnik.Color('yellow'),2))
            r.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color('red')))

            t = mapnik.TextSymbolizer('NAME', 'DejaVu Sans Book', 10, 
mapnik.Color('rgba(0,0,0,.8)') )
            t.avoid_edges = True

            t.halo_fill = mapnik.Color('rgba(255,255,255,.2)')
            t.halo_radius = 2

            r.symbols.append(t)
            r.filter = feature_filter

            s.rules.append(r)
            m.remove_style('selected')
            m.append_style('selected',s)

    im = mapnik.Image(m.width,m.height)
    mapnik.render(m, im)
    file = "c:\\IVVSL\\Results\\IVirMAP.png"
    print 'Rendering %s...' % file
    im.save(file)

I'm guessing that it is redrawing the map at each iteration of the PosQuery 
loop, and my previous labels are being obscured, but I don't see which command 
is causing it.  I've tried commenting out different lines to see how it affects 
it, but it still isn't clear.  Does anybody have any suggestions as to how to 
modify this loop to append all of the symbols on the same map.  It seems like 
it should be an easy issue to resolve, but I've tried many permutations of this 
code, and the result always ends up the same.  ie.  if i have a table with 
Canada, Hong Kong, and the United States (in that order) the only country that 
gets labeled is the United States.  I'd appreciate any assistance that you can 
provide to a mapnik noob.  Thanks.

-Roger
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to