view flys-backend/contrib/shpimporter/boundaries.py @ 5509:627584bc0586

Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets. Example: <dc:context> <dc:statement> SELECT DISTINCT name AS hws_name, official AS hws_official, kind_id AS hws_kind FROM hws_lines WHERE river_id = ${river_id} </dc:statement> <dc:if test="dc:has-result()"> <lines> <dc:macro name="hws-lines"> <dc:elements> <hws factory="hwsfactory" name="{$hws_name}"/> </dc:elements> </dc:macro> <dc:filter expr="$hws_official=1"> <dc:if test="dc:has-result()"> <official> <dc:filter expr="$hws_kind=1"> <dc:if test="dc:has-result()"> <Durchlass><dc:call-macro name="hws-lines"></Durchlass> </dc:if> </dc:filter> <dc:filter expr="$hws_kind=2"> <dc:if test="dc:has-result()"> <Damm><dc:call-macro name="hws-lines"></Damm> </dc:if> </dc:filter> <dc:filter expr="$hws_kind=3"> <dc:if test="dc:has-result()"> <Graben><dc:call-macro name="hws-lines"></Graben> </dc:if> </dc:filter> </official> </dc:if> </dc:filter> </lines> </dc:if> </dc:context>
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 28 Mar 2013 16:51:15 +0100
parents 71a24278322c
children 4e166c514940
line wrap: on
line source
try:
    from osgeo import ogr
except ImportError:
    import ogr

from importer import Importer
import utils

TABLE_NAME="hydr_boundaries"
TABLE_NAME_POLY="hydr_boundaries_poly"
PATH="Hydrologie/Hydr.Grenzen"
NAME="Hydr. Boundaries"


class HydrBoundary(Importer):

    def getPath(self, base):
        return "%s/%s" % (base, PATH)

    def getTablename(self):
        return TABLE_NAME

    def getName(self):
        return NAME

    def isGeometryValid(self, geomType):
        return geomType in [ogr.wkbLineString,
                            ogr.wkbLineString25D,
                            ogr.wkbMultiLineString25D,
                            ogr.wkbMultiLineString]

    def isShapeRelevant(self, name, path):
        shp = ogr.Open(path)
        if self.isGeometryValid(shp.GetLayerByName(name).GetGeomType()) and \
                self.getKind(path) > 0:
            return True
        else:
            return False

    def getKind(self, path):
        if "linien/bfg" in path.lower():
            return 1
        elif "linien/land" in path.lower():
            return 2
        elif "/sonstige/" in path.lower():
            return 3
        else:
            return 0

    def createNewFeature(self, featureDef, feat, **args):
        kind  = self.getKind(args['path'])

        newFeat  = ogr.Feature(featureDef)
        geometry = feat.GetGeometryRef()
        geometry.SetCoordinateDimension(3)

        newFeat.SetGeometry(geometry)
        newFeat.SetField("name", args['name'])
        newFeat.SetField("kind", kind)
        if self.IsFieldSet(feat, "SECTIE"):
            newFeat.SetField("sectie", feat.GetField("SECTIE"))

        if self.IsFieldSet(feat, "SOBEK"):
            newFeat.SetField("sobek", feat.GetField("SOBEK"))

        if self.IsFieldSet(feat, "river_id"):
            newFeat.SetField("river_id", feat.GetField("river_id"))
        else:
            newFeat.SetField("river_id", self.river_id)

        return utils.convertToMultiLine(newFeat)

class HydrBoundaryPoly(HydrBoundary):

    def getTablename(self):
        return TABLE_NAME_POLY

    def getName(self):
        return "%s (Polygons)" % NAME

    def isGeometryValid(self, geomType):
        return geomType == ogr.wkbPolygon or geomType == ogr.wkbMultiPolygon

    def isShapeRelevant(self, name, path):
        shp = ogr.Open(path)
        if self.isGeometryValid(shp.GetLayerByName(name).GetGeomType()) and \
                self.getKind(path) > 0:
            return True
        else:
            return False

    def createNewFeature(self, featureDef, feat, **args):
        kind  = self.getKind(args['path'])

        newFeat  = ogr.Feature(featureDef)
        geometry = feat.GetGeometryRef()
        geometry.SetCoordinateDimension(2)

        newFeat.SetGeometry(geometry)
        newFeat.SetField("name", args['name'])
        newFeat.SetField("kind", kind)

        if self.IsFieldSet(feat, "SECTIE"):
            newFeat.SetField("sectie", feat.GetField("SECTIE"))

        if self.IsFieldSet(feat, "SOBEK"):
            newFeat.SetField("sobek", feat.GetField("SOBEK"))


        if self.IsFieldSet(feat, "river_id"):
            newFeat.SetField("river_id", feat.GetField("river_id"))
        else:
            newFeat.SetField("river_id", self.river_id)

        return utils.convertToMultiPolygon(newFeat)

http://dive4elements.wald.intevation.org