Mercurial > dive4elements > river
diff flys-backend/contrib/shpimporter/importer.py @ 3689:c938e568c4a2 2.9
merged flys-backend/2.9
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:44 +0200 |
parents | 2cd2657b3d60 |
children | 82e931f88137 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-backend/contrib/shpimporter/importer.py Fri Sep 28 12:14:44 2012 +0200 @@ -0,0 +1,147 @@ +import ogr, osr +import shpimporter + +class Importer: + + def __init__(self, config): + self.config = config + self.dbconn = 'OCI:%s/%s@%s' % (config.user, config.password, config.host) + self.river_id = config.river_id + self.dest_srs = osr.SpatialReference() + self.dest_srs.ImportFromEPSG(config.target_srs) + + + 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 getName(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): + shpimporter.INFO("Skip shapefile '%s'" % path) + return + + shp = ogr.Open(shape[1]) + if shp is None: + shpimporter.ERROR("Shapefile '%s' could not be opened!" % path) + return + + shpimporter.INFO("Processing shapefile '%s'" % path) + srcLayer = shp.GetLayerByName(name) + + if srcLayer is None: + shpimporter.ERROR("Layer '%s' was not found!" % name) + return + + return self.shape2Database(srcLayer, name, path) + + + def transform(self, feat): + geometry = feat.GetGeometryRef() + src_srs = geometry.GetSpatialReference() + + if src_srs is None: + shpimporter.ERROR("No source SRS given! No transformation possible!") + return feat + + transformer = osr.CoordinateTransformation(src_srs, self.dest_srs) + geometry.Transform(transformer) + + return feat + + + def shape2Database(self, srcLayer, name, path): + table = ogr.Open(self.dbconn) + destLayer = table.GetLayerByName(self.getTablename()) + + if srcLayer is None: + shpimporter.ERROR("Shapefile is None!") + return -1 + + if destLayer is None: + shpimporter.ERROR("No destination layer given!") + return -1 + + count = srcLayer.GetFeatureCount() + shpimporter.DEBUG("Try to add %i features to database." % count) + + srcLayer.ResetReading() + + geomType = -1 + success = 0 + unsupported = 0 + creationFailed = 0 + featureDef = destLayer.GetLayerDefn() + + for feat in srcLayer: + geom = feat.GetGeometryRef() + + if geom is None: + continue + + geomType = geom.GetGeometryType() + + if self.isGeometryValid(geomType): + newFeat = self.createNewFeature(featureDef, + feat, + name=name, + path=path) + + if newFeat is not None: + newFeat.SetField("path", path) + newFeat = self.transform(newFeat) + res = destLayer.CreateFeature(newFeat) + if res is None or res > 0: + shpimporter.Error("Unable to insert feature: %r" % res) + else: + success = success + 1 + else: + creationFailed = creationFailed + 1 + else: + unsupported = unsupported + 1 + + shpimporter.INFO("Inserted %i features" % success) + shpimporter.INFO("Failed to create %i features" % creationFailed) + shpimporter.INFO("Found %i unsupported features" % unsupported) + + try: + if self.config.dry_run > 0: + return geomType + destLayer.CommitTransaction() + except e: + shpimporter.ERROR("Exception while committing transaction.") + + return geomType +