Mercurial > dive4elements > river
view flys-backend/contrib/shpimporter/importer.py @ 2853:bd9e76e0b55d
Improved the python shapefile importer.
flys-backend/trunk@4313 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Fri, 27 Apr 2012 06:39:12 +0000 |
parents | |
children | b0132e1b9719 |
line wrap: on
line source
import ogr class Importer: def __init__(self, dbconn, river_id): self.dbconn = dbconn self.river_id = river_id def getKind(self, path): raise NotImplementedError("Importer.getKind is abstract!") def getPath(self, base): raise NotImplementedError("Importer.getPath is abstract!") def getTablename(self): raise NotImplementedError("Importer.getTablename is abstract!") def IsFieldSet(self, feat, name): try: isset = feat.GetField(name) return isset is not None except: return False def IsDoubleFieldSet(self, feat, name): try: isset = feat.GetFieldAsDouble(name) return isset is not None except: return False def isShapeRelevant(self, name, path): return True def walkOverShapes(self, shape): (name, path) = shape if not self.isShapeRelevant(name, path): print "Skip shapefile '%s'" % name return shp = ogr.Open(shape[1]) if shp is None: print "Shapefile '%s' could not be opened!" % path return print "Opened shapefile '%s'" % path srcLayer = shp.GetLayerByName(name) if srcLayer is None: print "Layer '%s' was not found!" % name return return self.shape2Database(srcLayer, name, path) def shape2Database(self, srcLayer, name, path): table = ogr.Open(self.dbconn) destLayer = table.GetLayerByName(self.getTablename()) if srcLayer is None: print "Shapefile is None!" return -1 if destLayer is None: print "No destination layer given!" return -1 count = srcLayer.GetFeatureCount() print "Try to add %i features to database." % count srcLayer.ResetReading() geomType = -1 success = 0 unsupported = 0 featureDef = destLayer.GetLayerDefn() for feat in srcLayer: geom = feat.GetGeometryRef() geomType = geom.GetGeometryType() if self.isGeometryValid(geomType): newFeat = self.createNewFeature(featureDef, feat, name=name, path=path) if newFeat is not None: res = destLayer.CreateFeature(newFeat) if res is None or res > 0: print "Error while inserting feature: %r" % res else: success = success + 1 else: unsupported = unsupported + 1 print "Inserted %i features" % success print "Found %i unsupported features" % unsupported try: destLayer.CommitTransaction() except e: print "Exception while committing transaction." return geomType