ingo@2861: import ogr, osr ingo@3655: import shpimporter ingo@2853: ingo@2853: class Importer: ingo@2853: ingo@3654: def __init__(self, config): ingo@3654: self.config = config aheinecke@4871: if config.ogr_connection: aheinecke@4871: self.dbconn = '%s' % config.ogr_connection aheinecke@4871: else: aheinecke@4871: self.dbconn = 'OCI:%s/%s@%s' % (config.user, config.password, config.host) ingo@3654: self.river_id = config.river_id ingo@2861: self.dest_srs = osr.SpatialReference() ingo@3654: self.dest_srs.ImportFromEPSG(config.target_srs) ingo@2853: ingo@2853: ingo@2853: def getKind(self, path): ingo@2853: raise NotImplementedError("Importer.getKind is abstract!") ingo@2853: ingo@2853: ingo@2853: def getPath(self, base): ingo@2853: raise NotImplementedError("Importer.getPath is abstract!") ingo@2853: ingo@2853: ingo@2853: def getTablename(self): ingo@2853: raise NotImplementedError("Importer.getTablename is abstract!") ingo@2853: ingo@2853: ingo@3654: def getName(self): ingo@3654: raise NotImplementedError("Importer.getTablename is abstract!") ingo@3654: ingo@3654: ingo@2853: def IsFieldSet(self, feat, name): ingo@2853: try: ingo@2853: isset = feat.GetField(name) ingo@2853: return isset is not None ingo@2853: except: ingo@2853: return False ingo@2853: ingo@2853: ingo@2853: def IsDoubleFieldSet(self, feat, name): ingo@2853: try: ingo@2853: isset = feat.GetFieldAsDouble(name) ingo@2853: return isset is not None ingo@2853: except: ingo@2853: return False ingo@2853: ingo@2853: ingo@2853: def isShapeRelevant(self, name, path): ingo@2853: return True ingo@2853: ingo@2853: ingo@2853: def walkOverShapes(self, shape): ingo@2853: (name, path) = shape ingo@2853: if not self.isShapeRelevant(name, path): ingo@3655: shpimporter.INFO("Skip shapefile '%s'" % path) ingo@2853: return ingo@2853: ingo@2853: shp = ogr.Open(shape[1]) ingo@2853: if shp is None: ingo@3655: shpimporter.ERROR("Shapefile '%s' could not be opened!" % path) ingo@2853: return ingo@2853: ingo@3655: shpimporter.INFO("Processing shapefile '%s'" % path) ingo@2853: srcLayer = shp.GetLayerByName(name) ingo@2853: ingo@2853: if srcLayer is None: ingo@3655: shpimporter.ERROR("Layer '%s' was not found!" % name) ingo@2853: return ingo@2853: ingo@2853: return self.shape2Database(srcLayer, name, path) ingo@2853: ingo@2853: ingo@2861: def transform(self, feat): ingo@2861: geometry = feat.GetGeometryRef() ingo@2861: src_srs = geometry.GetSpatialReference() ingo@2861: ingo@2861: if src_srs is None: ingo@3679: shpimporter.ERROR("No source SRS given! No transformation possible!") ingo@2861: return feat ingo@2861: ingo@2861: transformer = osr.CoordinateTransformation(src_srs, self.dest_srs) ingo@2861: geometry.Transform(transformer) ingo@2861: ingo@2861: return feat ingo@2861: ingo@2861: ingo@2853: def shape2Database(self, srcLayer, name, path): ingo@2853: table = ogr.Open(self.dbconn) aheinecke@4871: if not table: aheinecke@4871: shpimporter.ERROR("Could not connect to database %s" % self.dbconn) aheinecke@4871: return -1 aheinecke@4871: ingo@2853: destLayer = table.GetLayerByName(self.getTablename()) ingo@2853: ingo@2853: if srcLayer is None: ingo@3655: shpimporter.ERROR("Shapefile is None!") ingo@2853: return -1 ingo@2853: ingo@2853: if destLayer is None: ingo@3655: shpimporter.ERROR("No destination layer given!") ingo@2853: return -1 ingo@2853: ingo@2853: count = srcLayer.GetFeatureCount() ingo@3655: shpimporter.DEBUG("Try to add %i features to database." % count) ingo@2853: ingo@2853: srcLayer.ResetReading() ingo@2853: ingo@2853: geomType = -1 ingo@2853: success = 0 ingo@2853: unsupported = 0 ingo@2861: creationFailed = 0 ingo@2853: featureDef = destLayer.GetLayerDefn() ingo@2853: ingo@2853: for feat in srcLayer: ingo@2853: geom = feat.GetGeometryRef() ingo@2861: ingo@2861: if geom is None: ingo@2861: continue ingo@2861: ingo@2853: geomType = geom.GetGeometryType() ingo@2853: ingo@2853: if self.isGeometryValid(geomType): ingo@2853: newFeat = self.createNewFeature(featureDef, ingo@2853: feat, ingo@2853: name=name, ingo@2853: path=path) ingo@2853: ingo@2853: if newFeat is not None: ingo@3677: newFeat.SetField("path", path) ingo@2861: newFeat = self.transform(newFeat) ingo@2853: res = destLayer.CreateFeature(newFeat) ingo@2853: if res is None or res > 0: ingo@3950: shpimporter.ERROR("Unable to insert feature: %r" % res) ingo@2853: else: ingo@2853: success = success + 1 ingo@2861: else: ingo@2861: creationFailed = creationFailed + 1 ingo@2853: else: ingo@2853: unsupported = unsupported + 1 ingo@2853: ingo@3655: shpimporter.INFO("Inserted %i features" % success) ingo@3655: shpimporter.INFO("Failed to create %i features" % creationFailed) ingo@3655: shpimporter.INFO("Found %i unsupported features" % unsupported) ingo@2853: ingo@2853: try: ingo@3655: if self.config.dry_run > 0: ingo@3655: return geomType ingo@2853: destLayer.CommitTransaction() ingo@2853: except e: ingo@3655: shpimporter.ERROR("Exception while committing transaction.") ingo@2853: ingo@2853: return geomType ingo@2853: