view flys-backend/contrib/shpimporter/buildings.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 ff11b178f152
children b91cc44312b7
line wrap: on
line source
# -*- coding: utf-8 -*-
try:
    from osgeo import ogr
except ImportError:
    import ogr

from importer import Importer

TABLE_NAME="buildings"
PATH="Geodaesie/Bauwerke"
NAME="Buildings"

BUILDING_KINDS= {
        "sonstige" : 0,
        "brücken"  : 1,
        "wehre"    : 2,
        "pegel"    : 3,
        }

class Building(Importer):
    fieldmap = {
            "^station$"       : "km",
            "^km$"            : "km",
            "^wsv-km$"        : "km",
            "^z$"             : "z",
            "^H[oeö]{0,2}he$" : "z",
            "^m+NHN$"         : "z",
            "^KWNAAM$"        : "description",
            "^Name$"          : "description"
        }

    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 == 2


    def isShapeRelevant(self, name, path):
        return "buhnen.shp" not in name.lower()

    def getKind(self, feat, path):
        # First try to resolve it with the filename
        for fname in ["brücke.shp", "bruecke.shp",
                     "brücken.shp", "bruecken.shp"]:
            if path.lower().endswith(fname):
                return BUILDING_KINDS["brücken"]
        for fname in ["wehr.shp", "wehre.shp"]:
            if path.lower().endswith(fname):
                return BUILDING_KINDS["wehre"]
        for fname in ["pegel.shp"]:
            if path.lower().endswith(fname):
                return BUILDING_KINDS["pegel"]

        # Now it gets ugly when we search all attributes
        ret = self.searchValue(feat, "^br[ueü]{0,2}cke[n]{0,1}$")
        if ret:
            self.handled(ret)
            return BUILDING_KINDS["brücken"]
        ret = self.searchValue(feat, "^wehr[e]{0,1}$")
        if ret:
            self.handled(ret)
            return BUILDING_KINDS["wehre"]

        return BUILDING_KINDS["sonstige"]


    def createNewFeature(self, featureDef, feat, **args):
        newFeat  = ogr.Feature(featureDef)
        geometry = feat.GetGeometryRef()
        geometry.SetCoordinateDimension(2)
        newFeat.SetGeometry(geometry)

        self.copyFields(feat, newFeat, self.fieldmap)

        newFeat.SetField("kind_id", self.getKind(feat, args['path']))
        newFeat.SetField("name", args["name"])

        newFeat.SetField("river_id", self.river_id)

        return newFeat

http://dive4elements.wald.intevation.org