I am new to Mapnik, so I am not sure if this is a bug or I am just doing 
something wrong.
I am trying to use an s57 (NOAA ENC .000) file as the datasource and extract 
multiple layers from the same file.
I am using Mapnik2 from http://dbsgeo.com/downloads/  on OS X 10.6.6 with the 
Kyngchaos 1.8 framework distribution.


I have no problem extracting one layer at a time and generating a mapnik map 
but if I try to use two layers then mapnik crashes with
a segmentation fault. Either layer works fine independently (I tried several 
different layers and they all work independently but any
time I use more than one layer I get the fault.

The seg fault is caused  when I call mapnik.Ogr() the second time as in:

seaData = mapnik.Ogr(file= srcPath, layer='SEAARE')
landData = mapnik.Ogr(file= srcPath, layer='LNDARE') #seg fault occurs here

Also the first time in the same python session in a terminal that I try to use 
two layers I get a cryptic warning but both layers plot. 
Any subsequent attempts produce the seg fault. I have to close the terminal 
window to "reset" something in mapnik, that then produces the warning,and then 
subsequent seg faults. I would guess that Mapnik is locking up a resource 
associated with the file that should be reentrant
but is not. (Or maybe its me)

Here is the warning. 

Warning 1: Illegal feature attribute id (ATTF:ATTL[0]) of 116
on feature FIDN=333014085, FIDS=4843.
Skipping attribute, no more warnings will be issued.


The code is below 

def TestENC(srcFile, dstFile):
   """Generates map image from NOAA ENC format source file (S57 .000)
      specified by srcFile. If srcFile has extension .000 then extracts base
      if not then uses srcFile as base
      so that complete path to source is given by
      ../data/ENC/Florida/base/base.000
      
      Saves map image as .png  in folder ../maps/ with file name dstFile
      
      Usage: mapt.TestENC('US5FL88M', 'Test188')
   """
   import mapnik2 as mapnik
   
   base, ext = os.path.splitext(srcFile)
   if ext not in['.000']:
      srcFile = '.'.join([srcFile, '000'])
   
   base, ext = os.path.splitext(srcFile)
   srcPath = os.path.join("../data/ENC/Florida/",base, srcFile)
   print "Source file = %s" % srcPath
   
   base, ext = os.path.splitext(dstFile)
   if ext not in ['.png']:
      dstFile = '.'.join([dstFile, 'png'])
   dstPath = os.path.join( "../maps/", dstFile)
   print "Destination file = %s" % dstPath
   
   MIN_LAT  = 27.475
   MAX_LAT  = 27.490
   MIN_LONG = -80.32
   MAX_LONG = -80.25
   
   MAP_WIDTH  = 800
   MAP_HEIGHT = 600
   
   print "Setting up styles"
   # Set up our "Sea Area" layer styles
   seaStyle = mapnik.Style()
   
   rule = mapnik.Rule()
   symbol = mapnik.PolygonSymbolizer(mapnik.Color('rgb(0%,20%,80%)'))
   rule.symbols.append(symbol)
   seaStyle.rules.append(rule)
   
   rule = mapnik.Rule()
   symbol = mapnik.LineSymbolizer(mapnik.Color('rgb(0%,0%,0%)'), 0.1)
   rule.symbols.append(symbol)
   seaStyle.rules.append(rule)
   
    # Set up our "Land Area" layer styles.
   landStyle = mapnik.Style()
   
   rule = mapnik.Rule()
   #rule.filter = mapnik.Filter("[NAME] = 'Angola'")
   symbol = mapnik.PolygonSymbolizer(mapnik.Color('rgb(15%,80%,15%)'))
   rule.symbols.append(symbol)
   landStyle.rules.append(rule)
   
   rule = mapnik.Rule()
   symbol = mapnik.LineSymbolizer(mapnik.Color('rgb(0%,0%,0%)'), 0.1)
   rule.symbols.append(symbol)
   landStyle.rules.append(rule)
   
   print "Setting up layers"
   # Set up our map layers.
   
   print "Setting up sea layer"
   # Sea Layer
   # Set up datasource for layer
   seaData = mapnik.Ogr(file= srcPath, layer='SEAARE')
   # Setup layer and attach data and styles
   seaLayer = mapnik.Layer("Sea")
   seaLayer.datasource = seaData
   seaLayer.styles.append("seaStyle")
   
   print "Setting up land layer"
   # Land Layer
   # Set up datasource for layer
#*************** Next line causes the fault  *************/
   landData = mapnik.Ogr(file= srcPath, layer='LNDARE')
   # Setup layer and attach data and styles
   landLayer = mapnik.Layer("Land")
   landLayer.datasource = landData
   landLayer.styles.append("landStyle")
  
   # Create our map.
   # +proj=longlat means use units of angular degrees
   map = mapnik.Map(MAP_WIDTH, MAP_HEIGHT, "+proj=longlat +datum=WGS84")
   
   map.background = mapnik.Color('rgb(80%,80%,80%)')
   
   map.append_style("landStyle", landStyle)
   map.append_style("seaStyle", seaStyle)
   
   map.layers.append(seaLayer)
   map.layers.append(landLayer)
   
   # Finally, render the map.
   print "Rendering Map"
   map.zoom_to_box(mapnik.Envelope(MIN_LONG, MIN_LAT, MAX_LONG, MAX_LAT))
   mapnik.render_to_file(map,dstPath, "png")



**********************************************************************
Samuel M. Smith Ph.D.
242 East 600 North, Lindon Utah 84042-1662 USA
801-768-2768 voice
801-768-2769 fax

**********************************************************************
"The greatest source of failure and unhappiness in the world is 
giving up what we want most for what we want at the moment"
**********************************************************************






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

Reply via email to