view flys-backend/contrib/shpimporter/ @ 4977:ee908e4946cd dami

corrected Typo
author Tom Gottfried <>
date Wed, 13 Feb 2013 18:35:37 +0100
parents 9eea3cd22ee7
children b5ac7588cf4d
line wrap: on
line source
    from osgeo import ogr
except ImportError:
    import ogr

import utils, optparse
import sys
import os

from uesg  import UESG
from axis  import Axis
from km    import KM
from lines import Line
from fixpoints import Fixpoint
from buildings import Building
from crosssectiontracks import CrosssectionTrack
from floodplains import Floodplain
from boundaries import HydrBoundary, HydrBoundaryPoly
from hws import HWSLines, HWSPoints
from gauges import GaugeLocation
from catchments import Catchment
from dgm import insertRiverDgm


def DEBUG(msg):
    config = getConfig()
    if config.verbose >= VERBOSE_DEBUG:
        print "DEBUG: %s" % msg

def INFO(msg):
    config = getConfig()
    if config.verbose >= VERBOSE_INFO:
        print "INFO: %s" % msg

def ERROR(msg):
    config = getConfig()
    print "ERROR: %s" % msg

def getImporters(river_id, dbconn, dry_run):
    return [
        Axis(river_id, dbconn, dry_run),
        KM(river_id, dbconn, dry_run),
        CrosssectionTrack(river_id, dbconn, dry_run),
        Line(river_id, dbconn, dry_run),
        Fixpoint(river_id, dbconn, dry_run),
        Building(river_id, dbconn, dry_run),
        Floodplain(river_id, dbconn, dry_run),
        HydrBoundary(river_id, dbconn, dry_run),
        HydrBoundaryPoly(river_id, dbconn, dry_run),
        HWSLines(river_id, dbconn, dry_run),
        HWSPoints(river_id, dbconn, dry_run),
        GaugeLocation(river_id, dbconn, dry_run),
        Catchment(river_id, dbconn, dry_run),
        UESG(river_id, dbconn, dry_run)

def getConfig():
    parser = optparse.OptionParser()
    parser.add_option("--directory", type="string")
    parser.add_option("--target_srs", type="int")
    parser.add_option("--host", type="string")
    parser.add_option("--user", type="string")
    parser.add_option("--password", type="string")
    parser.add_option("--river_name", type="string")
    parser.add_option("--verbose", type="int", default=1)
    parser.add_option("--dry_run", type="int", default=0)
    parser.add_option("--ogr_connection", type="string")
    parser.add_option("--skip_axis", type="int")
    parser.add_option("--skip_hydr_boundaries", type="int")
    parser.add_option("--skip_buildings", type="int")
    parser.add_option("--skip_crosssections", type="int")
    parser.add_option("--skip_lines", type="int")
    parser.add_option("--skip_fixpoints", type="int")
    parser.add_option("--skip_floodplains", type="int")
    parser.add_option("--skip_hws_lines", type="int")
    parser.add_option("--skip_hws_points", type="int")
    parser.add_option("--skip_gauge_locations", type="int")
    parser.add_option("--skip_catchments", type="int")
    parser.add_option("--skip_kms", type="int")
    parser.add_option("--skip_uesgs", type="int")
    parser.add_option("--skip_dgm", type="int")
    (config, args) = parser.parse_args()

    if == None:
        ERROR("No river directory specified!")
        raise Exception("Invalid config")
    if not config.ogr_connection:
        if not
            ERROR("No database host specified!")
            raise Exception("Invalid config")
        if not config.user:
            ERROR("No databaser user specified!")
            raise Exception("Invalid config")
        if not config.password:
            ERROR("No password specified!")
            raise Exception("Invalid config")

    return config

def skip_importer(config, importer):
    if config.skip_axis == 1 and isinstance(importer, Axis):
        return True
    elif config.skip_hydr_boundaries == 1 and isinstance(importer, HydrBoundary):
        return True
    elif config.skip_hydr_boundaries == 1 and isinstance(importer, HydrBoundaryPoly):
        return True
    elif config.skip_buildings == 1 and isinstance(importer, Building):
        return True
    elif config.skip_crosssections == 1 and isinstance(importer, CrosssectionTrack):
        return True
    elif config.skip_lines == 1 and isinstance(importer, Line):
        return True
    elif config.skip_fixpoints == 1 and isinstance(importer, Fixpoint):
        return True
    elif config.skip_floodplains == 1 and isinstance(importer, Floodplain):
        return True
    elif config.skip_hws_lines == 1 and isinstance(importer, HWSLines):
        return True
    elif config.skip_hws_points == 1 and isinstance(importer, HWSPoints):
        return True
    elif config.skip_gauge_locations == 1 and isinstance(importer, GaugeLocation):
        return True
    elif config.skip_catchments == 1 and isinstance(importer, Catchment):
        return True
    elif config.skip_kms == 1 and isinstance(importer, KM):
        return True
    elif config.skip_uesgs == 1 and isinstance(importer, UESG):
        return True

    return False

def main():
        config = getConfig()
        return -1

    if config == None:
        ERROR("Unable to read config from command line!")

    if config.dry_run > 0:
        INFO("You enable 'dry_run'. No database transaction will take place!")

    if config.ogr_connection:
        connstr = config.ogr_connection
        connstr = 'OCI:%s/%s@%s' % (config.user, config.password,

    if 'OCI:' in connstr:
            import cx_Oracle as dbapi
            raw_connstr=connstr.replace("OCI:", "")
        except ImportErrror:
            ERROR("Module cx_Oracle not found in: %s\n"
                  "Neccessary to connect to a Oracle Database.\n"
                  "Please refer to the installation "
                  "documentation." % sys.path)

    else: # Currently only support for oracle and postgres
            import psycopg2 as dbapi
            raw_connstr=connstr.replace("PG:", "")
        except ImportError:
            ERROR("Module psycopg2 not found in: %s\n"
                  "Neccessary to connect to a Posgresql Database.\n"
                  "Please refer to the installation "
                  "documentation." % sys.path)

    dbconn_raw = dbapi.connect(raw_connstr)
    dbconn = ogr.Open(connstr)

    if dbconn == None:
        ERROR("Could not connect to database %s" % connstr)
        return -1

    types = {}

    directories = []
    if not config.river_name:
        for file in os.listdir(
            if os.path.isdir(file):

    for directory in directories:
        if not config.river_name:
            river_name = os.path.basename(os.path.normpath(directory))
            river_name = config.river_name
        river_id = utils.getRiverId(dbconn_raw, river_name)

        if not river_id:
            INFO("Could not find river in database. Skipping: %s"
                  % river_name)
            INFO("Importing River: %s" % river_name)

        for importer in getImporters(river_id, dbconn, config.dry_run):
            if skip_importer(config, importer):
                INFO("Skip import of '%s'" % importer.getName())

            INFO("Start import of '%s'" % importer.getName())

            shapes = utils.findShapefiles(importer.getPath(
            DEBUG("Found %i Shapefiles" % len(shapes))

            for shpTuple in shapes:
                geomType = importer.walkOverShapes(shpTuple)
                    if geomType is not None:
                        num = types[geomType]
                        types[geomType] = num+1
                    types[geomType] = 1

        for key in types:
            DEBUG("%i x geometry type %s" % (types[key], key))

        if not config.skip_dgm:
            dgmfilename = os.path.join(
          , "..", "DGMs.csv")
                dgmfile = open(dgmfilename, "r")
            except IOError:
                INFO("Could not find DGM file: %s \n"
                     "Skipping DGM import." % dgmfilename)
            if dgmfilename:
                INFO("Inserting DGM meta information in 'dem' table.")
                insertRiverDgm(dbconn_raw, dgmfilename, river_name, config.dry_run)

if __name__ == '__main__':