view flys-backend/contrib/shpimporter/shpimporter.py @ 4871:890eaa0a5162

Add ogr_connection parameter to allow directly setting the ogr connection. This allows the importer to connect with all supported and not just OCI
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 23 Jan 2013 11:51:14 +0100
parents 8654e4480fc6
children a563e9f58f93
line wrap: on
line source
import ogr

import utils, optparse

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 HWS
from gauges import GaugeLocation
from catchments import Catchment


VERBOSE_DEBUG=2
VERBOSE_INFO=1


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(config):
    return [
        Axis(config),
        KM(config),
        CrosssectionTrack(config),
        Line(config),
        Fixpoint(config),
        Building(config),
        Floodplain(config),
        HydrBoundary(config),
        HydrBoundaryPoly(config),
        HWS(config),
        GaugeLocation(config),
        Catchment(config),
        UESG(config)
        ]


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_id", type="int")
    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", 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")
    (config, args) = parser.parse_args()

    if config.directory == None:
        ERROR("No river directory specified!")
        raise Exception("Invalid config")
    if not config.ogr_connection:
        if not config.host:
            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")
    if config.river_id == None:
        ERROR("No river id 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 == 1 and isinstance(importer, HWS):
        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 parse():
    config=None
    try:
        config = getConfig()
    except:
        return

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

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

    importers = getImporters(config)
    types = {}

    for importer in importers:
        if skip_importer(config, importer):
            INFO("Skip import of '%s'" % importer.getName())
            continue

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

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

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

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


if __name__ == '__main__':
    parse()

http://dive4elements.wald.intevation.org