view flys-backend/contrib/shpimporter/buildings.py @ 5779:ebec12def170

Datacage: Add a pool of builders to make it multi threadable. XML DOM is not thread safe. Therefore the old implementation only allowed one thread to use the builder at a time. As the complexity of the configuration has increased over time this has become a bottleneck of the whole application because it took quiet some time to build a result. Furthermore the builder code path is visited very frequent. So many concurrent requests were piled up resulting in long waits for the users. To mitigate this problem a round robin pool of builders is used now. Each of the pooled builders has an independent copy of the XML template and can be run in parallel. The number of builders is determined by the system property 'flys.datacage.pool.size'. It defaults to 4.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 21 Apr 2013 12:48:09 +0200
parents b91cc44312b7
children
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 path.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