[mapserver-users] mapscript Perl/Python: DBF

Michael Schulz mschulz at webgis.de
Tue Jul 23 01:55:16 PDT 2002


Hi List,

i have a python-mapscript script that queries a database, queries for
each returned value a layer (via filteritem/filter) and then retrieves
the resulting shapeOj and puts it in a new shapefileObj. the dbf-file
for the new shapefileObj is also generated with msDBFCreate, then twqo
fields are created and later records are added to the dbf, finally the
dbf file are closed.

The problem is now, that this sometimes does not work and it crashes
with a segmentation fault. It seems, this script is working when the
dbf-files that are to be created do not exist in the specified
directory. So i build a method that prior to creating the shape and dfb
files looks in the directory and if present deletes the shp/shp/dbf
file. But still the script crashes- if i do it manually it works.

Can somebody give me a hint, i if have to do something special with the
DBFInfoObj's or sth similar: That would be great.

Cheers, Michael

P.S.: the source code of the script:

--snip

  newshpname = '/var/www/plz_veranst'
  newshp = shapefileObj(newshpname,MS_SHAPEFILE_POINT)
  newshpdbf = msDBFCreate(newshpname+'.dbf')
  msDBFAddField(newshpdbf,'PLZ',0,5,0)
  msDBFAddField(newshpdbf,'NAME',0,35,0)

  # Query existing plz-points and copy values to new plz_veranst
  plzdbf = msDBFOpen('/var/www/plz_points.dbf',"rb")
  plzmap = mapObj('/var/www/test.map')
  plzlayer = plzmap.getLayerByName('orte_gesamt')
  plzlayer.filteritem="PLZ"
  plzshp = shapefileObj('/var/www/plz_points',-1)
  count=0
  for vlist_item in vlist: # vlist is a list of integers
    plzlayer = plzmap.getLayerByName('orte_gesamt')
    plzlayer.filteritem="PLZ"
    plzlayer.setFilter("\"%d\"" % int(vlist_item))
    plzlayer.queryByAttributes(plzmap,MS_SINGLE)
    if plzlayer.resultcache.numresults == 1:
      r = plzlayer.getResult(0)
      ptshp = shapeObj(-1)
      plzshp.get(r.shapeindex, ptshp)
      name = msDBFReadStringAttribute(plzdbf,r.shapeindex,2)
      newshp.add(ptshp)
      msDBFWriteStringAttribute(newshpdbf, count, 0, vlist_item)
      msDBFWriteStringAttribute(newshpdbf, count, 1, name)
      count=count+1
  msDBFClose(plzdbf)
  msDBFClose(newshpdbf)

--snip

--
-----------------------------------------------------------
Michael Schulz                                in medias res
Dipl.-Geologe                              Gesellschaft für
                                Informationstechnologie mbH
                             Sautierstr. 38, 79104 Freiburg
                                     0761 55695-95 (Fax 96)
mschulz at webgis.de                             www.webgis.de





More information about the MapServer-users mailing list