Artem's ExampleCode, via: https://lists.berlios.de/pipermail/mapnik-users/2006-March/000050.html

On 06/03/06, Artem Pavlenko <artem at pavlenko.uklinux.net> wrote:

I would like Python code examples and especially code for Postgis retrieval.

Yep, postgis plug-in is undocumented so here is some info: (based on latest changes in svn e.g. there are two ways to create a Layer at the moment:

  1. params = {"name":"value",....} lay = CreateLayer?(params) #python dict
  2. lay = Layer(type="postgis",host="127.0.0.1",...) #named arguments

)

PostGIS parameters/named args:
"type" -> "postgis"
"name" -> layer name
"host"   -> localhost or whatever ..
"dbname" -> database name
"user"       -> user name
"password" ->password
"table"  -> table name with geometry column (properly created and defined "geometry_columns")  
 or SQL statement returning (amongst others) GID and WKB geometry (see python example below).

My attempt to render OS Mastermap according their own published 'in-house' styling (unfinished). I used ogr2ogr to convert GML to PostgreSQL.

Cheers, Artem

#!/usr/bin/env /opt/python/bin/python

from mapnik import *

def load_styles(Map) :
    s=Style()
    r=Rule('buildingFill')
    r.filter=Filter("[osgb:descriptivegroup] = 'Building'")
    r.symbols.append(PolygonSymbolizer(Color('#ffcc99')))
    s.rules.append(r)
    r=Rule('stepFill')
    r.filter=Filter("[osgb:descriptiveterm] = 'Step'")
    r.symbols.append(PolygonSymbolizer(Color('#cccc99')))
    s.rules.append(r)

    

    r=Rule('glasshouseFill')
    r.filter=Filter("[osgb:descriptivegroup] = 'Glasshouse'")
    r.symbols.append(PolygonSymbolizer(Color('#ffcc99)')))    
    s.rules.append(r)
    r=Rule('heritageFill')
    r.filter=Filter("[osgb:descriptivegroup] = 'Historic Interest'")
    r.symbols.append(PolygonSymbolizer(Color('#cc9966')))    
    s.rules.append(r)

    

    r=Rule('inlandWaterFill')
    r.filter=Filter("[osgb:descriptivegroup] = 'Inland Water'")
    r.symbols.append(PolygonSymbolizer(Color('#99ffff')))    
    s.rules.append(r)

    

    r=Rule('naturalEnvironmentFill','area')
    r.filter=Filter("[osgb:descriptivegroup] = 'Natural Environment'")
    r.symbols.append(PolygonSymbolizer(Color('#ccffcc')))    
    s.rules.append(r)
    r=Rule('naturalEnvironmentFill','area')
    r.filter=Filter("[osgb:descriptivegroup] = 'Natural Environment'")
    r.symbols.append(PolygonSymbolizer(Color('#ccffcc')))    
    s.rules.append(r)
    r=Rule('pathFill','area')
    r.filter=Filter("[osgb:descriptivegroup] = 'Path'")
    r.symbols.append(PolygonSymbolizer(Color('#cccccc')))    
    s.rules.append(r)
    r=Rule('roadFill','Road or Track')
    r.filter=Filter("[osgb:descriptivegroup] = 'Road Or Track'")
    r.symbols.append(PolygonSymbolizer(Color('#cccccc')))    
    s.rules.append(r)

    r=Rule('structureFill','Structure')
    r.filter=Filter("[osgb:descriptivegroup] = 'Structure'")    
    r.symbols.append(PolygonSymbolizer(Color('#cc9966')))    
    s.rules.append(r)

    r=Rule('tidalWaterFill','Tidal Water')
    r.filter=Filter("[osgb:descriptivegroup] = 'Tidal Water'")
    r.symbols.append(PolygonSymbolizer(Color('#99ffff')))    
    s.rules.append(r)
    r=Rule('unclassifiedFill','Unclassified')
    r.filter=Filter("[osgb:descriptivegroup] = 'Unclassified'")
    r.symbols.append(PolygonSymbolizer(Color('#ffffff')))    
    s.rules.append(r)
    r=Rule('railFill','Rail')
    r.filter=Filter("[osgb:descriptivegroup] = 'Rail' and [osgb:make]='Manmade'")
    r.symbols.append(PolygonSymbolizer(Color('#cccccc')))    
    s.rules.append(r)
    r=Rule('manmadeLandformPattern','')
    r.filter=Filter("[osgb:descriptivegroup] = 'Landform' and [osgb:make]='Manmade'")
    #r.symbols.append(PolygonPatternSymbolizer("/home/artem/pattern1.png",25,25))
    s.rules.append(r)
    r=Rule('naturalLandformPattern','')
    r.filter=Filter("[osgb:descriptivegroup] = 'Landform' and [osgb:make]='Natural'")
    r.symbols.append(PolygonSymbolizer(Color('#ff0000')))    
    s.rules.append(r)

    r=Rule('madeSurfaceFill','Manmade')

    r.filter=Filter("[osgb:make]='Manmade'")
    r.symbols.append(PolygonSymbolizer(Color('#cccc99')))    
    s.rules.append(r)
    r=Rule('naturalSurfaceFill','Natural')
    r.filter=Filter("[osgb:make]='Natural'")
    r.symbols.append(PolygonSymbolizer(Color('#ccffcc')))    
    s.rules.append(r)
    r=Rule('madeSurfaceFill','Unknown')
    r.filter=Filter("[osgb:make]='Unknown'")
    r.symbols.append(PolygonSymbolizer(Color('#cccc99')))    
    s.rules.append(r)
    
    r=Rule('multipleSurfaceFill','Multiple')
    r.filter=Filter("[osgb:make]='Multiple'")
    r.symbols.append(PolygonSymbolizer(Color('#ffffcc')))    
    s.rules.append(r)
    
    #TODO! else filter  
    m.append_style("TopographicArea",s)
    #line styles    
    s=Style()
    
    r=Rule('buildingOverheadLine','Building Overhead')
    r.filter=Filter("[osgb:descriptivegroup] = 'Building' and [osgb:physicalpresence]='Overhead' ")
    r.symbols.append(LineSymbolizer(Color('#ff0000'),0.5))
    #s.rules.append(r)
    r=Rule('structureOverheadLine','Structure Overhead')
    r.filter=Filter("[osgb:descriptiveterm] = 'Overhead Construction'")
    r.symbols.append(LineSymbolizer(Color('#ff0000'),0.5))
    s.rules.append(r)
    r=Rule('buildingLine','Structure Overhead')
    r.filter=Filter("[osgb:descriptivegroup] = 'Building'")
    r.symbols.append(LineSymbolizer(Color('#ff0000'),0.7))
    s.rules.append(r)
    r=Rule('waterBoldLine','Mean High Water (Springs)')
    r.filter=Filter("[osgb:descriptiveterm] = 'Mean High Water (Springs)'")
    r.symbols.append(LineSymbolizer(Color('#0099ff'),4.0))
    s.rules.append(r)

    r=Rule('waterDashedLine','Mean Low Water (Springs)')
    r.filter=Filter("[osgb:descriptiveterm] = 'Mean Low Water (Springs)'")
    stk=Stroke()
    stk.color=Color('#0099ff')
    stk.add_dash(5.0,5.0)
    stk.width=1.0
    r.symbols.append(LineSymbolizer(stk))
    s.rules.append(r)
    r=Rule('waterLine','Inland Water')
    r.filter=Filter("[osgb:descriptivegroup] = 'Inland Water'")
    r.symbols.append(LineSymbolizer(Color('#0099ff'),0.7))
    s.rules.append(r)

    

    r=Rule('general feature','line',0.001,5.0)
    r.filter=Filter("([osgb:featurecode] = 10046 or [osgb:featurecode] = 10058 ) and [osgb:physicallevel] = 'Edge/Limit'")
    s_=Stroke()
    s_.color=Color('#333333')
    s_.add_dash(4.0,4.0)
    s_.width=0.7
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    
    r=Rule('general feature','line',0.001,5.0)
    r.filter=Filter("([osgb:featurecode] = 10046 or [osgb:featurecode] = 10058) and not ([osgb:physicallevel] = 'Edge/Limit')")
    s_=Stroke()
    s_.color=Color('#333333')
    s_.width=0.7
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    
    r=Rule('general feature','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] = 10168 or [osgb:featurecode] = 10189 or [osgb:featurecode] = 10052")
    s_=Stroke()
    s_.color=Color('#333333')
    s_.width=0.4
    s_.add_dash(4.0,4.0)
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    r=Rule('water','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] = 10087 or [osgb:featurecode] = 10085")
    s_=Stroke()
    s_.color=Color('#0099ff')
    s_.width=0.7     
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    r=Rule('rail','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] >= 10162 and [osgb:featurecode] <=10164")
    s_=Stroke()
    s_.color=Color('#333333')
    s_.width=0.7
    s_.add_dash(10,5)
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    r=Rule('slope','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] = 10098")
    s_=Stroke()
    s_.color=Color('#669966')
    s_.width=2.0
    s_.add_dash(4,4)
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)
    r=Rule('slope','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] = 10097")
    s_=Stroke()
    s_.color=Color('#669966')
    s_.width=0.6
    s_.add_dash(4,4)
    r.symbols.append(LineSymbolizer(s_))

    s.rules.append(r)
    r=Rule('parish','line',0.001,5.0)
    r.filter=Filter("[osgb:featurecode] = 10136")

    s_=Stroke()
    s_.color=Color('#ff00ff')
    s_.width=4.0
    s_.add_dash(4,8)
    r.symbols.append(LineSymbolizer(s_))
    s.rules.append(r)

    m.append_style("TopographicLine",s)

def create_map(width,height) :   
 
    m=Map(width,height)
    m.background=Color('white')
    params = {"type":"postgis","name":"mastermap-line","host":"localhost",
              "dbname":"gis","user":"postgres","password":"postgres",
              "table":"(select * from basingstoke where geometrytype(wkb_geometry)='POLYGON' and \"osgb:descriptivegroup\" <> 'Landform') as polygons"}
    lyr=CreateLayer(params)    
    lyr.styles.append("TopographicArea")
    m.layers.append(lyr)
    params["table"]="(select * from basingstoke where geometrytype(wkb_geometry)='LINESTRING' and \"osgb:descriptivegroup\" <> 'Landform') as linestrings"
    

    lyr=CreateLayer(params)    
    lyr.styles.append("TopographicLine")
    m.layers.append(lyr)
    #m.zoom_to_box(lyr.envelope())
    m.zoom_to_box(Envelope(461000,153500,461400,153900))
    return m

if __name__=="__main__":   
    m = create_map(1200,800)
    load_styles(m)  
    render_to_file(m,'mastermap.png','png')