diff flys-backend/contrib/shpimporter/hws.py @ 5379:61bf64b102bc mapgenfix

Merge with default branch
author Christian Lins <christian.lins@intevation.de>
date Fri, 22 Mar 2013 11:25:54 +0100
parents 028ff568b196
children f66a6c1a73e7
line wrap: on
line diff
--- a/flys-backend/contrib/shpimporter/hws.py	Wed Mar 06 14:14:15 2013 +0100
+++ b/flys-backend/contrib/shpimporter/hws.py	Fri Mar 22 11:25:54 2013 +0100
@@ -3,44 +3,196 @@
 
 try:
     from osgeo import ogr
-except ImportErrror:
+except ImportError:
     import ogr
 
 from importer import Importer
 import utils
 
+import logging
+logger = logging.getLogger("HWS")
+
 PATH="Hydrologie/HW-Schutzanlagen"
 NAME="HWS"
 
 # Keep in sync with hws_kinds table:
+# strings need to be lowercase
 HWS_KIND = {
-        "Durchlass" : 1,
-        "Damm" : 2,
-        "Deich" : 2,
-        "Graben" : 3,
+        "durchlass" : 1,
+        "damm" : 2,
+        "deich" : 2,
+        "hochufer" : 2,
+        "graben" : 3,
+        "rohr1" : 1,
+        "rohr 1" : 1,
+        "rohr 2" : 1,
+        "hauptdeich" : 2,
+        "sommerdeich" : 2
     }
 
 # Keep in sync with fed_states table:
+# strings need to be lowercase
 FED_STATES = {
-    "Bayern" : 1,
-    "Hessen" : 2,
-    "Niedersachsen" : 3,
-    "Nordrhein-Westfalen" : 4,
-    "Rheinland-Pfalz" : 5,
-    "Saarland" : 6,
-    "Schleswig-Holstein" : 7,
-    "Brandenburg" : 8,
-    "Mecklenburg-Vorpommern" : 9,
-    "Thüringen" : 10,
-    "Baden-Württemberg" : 11,
-    "Sachsen-Anhalt" : 12,
-    "Sachsen" : 13,
-    "Berlin" : 14,
-    "Bremen" : 15,
-    "Hamburg" : 16,
+    "bayern" : 1,
+    "hessen" : 2,
+    "niedersachsen" : 3,
+    "nordrhein-westfalen" : 4,
+    "nordrhein westfalen" : 4,
+    "rheinland-pfalz" : 5,
+    "rheinland pfalz" : 5,
+    "saarland" : 6,
+    "schleswig-holstein" : 7,
+    "schleswig holstein" : 7,
+    "brandenburg" : 8,
+    "mecklenburg-vorpommern" : 9,
+    "mecklenburg vorpommern" : 9,
+    "thüringen" : 10,
+    "baden-württemberg" : 11,
+    "baden württemberg" : 11,
+    "sachsen-anhalt" : 12,
+    "sachsen anhalt" : 12,
+    "sachsen" : 13,
+    "berlin" : 14,
+    "bremen" : 15,
+    "hamburg" : 16,
 }
 
-class HWSLines(Importer):
+class HWSPoints(Importer):
+    fieldmap = {
+            "name$" : "name",
+            "quelle$" : "source",
+            "anmerkung$" : "description",
+            "stand$" : "status_date",
+            "verband$" : "agency",
+            "Deich_{0,1}KM$" : "dike_km",
+            "Bereich$" : "range",
+            "H[oeö]{0,2}he_{0,1}SOLL$" : "z_target",
+            "(WSP_){0,1}BfG_{0,1}100$" : "rated_level",
+            "H[oeö]{0,2}he_{0,1}IST$" : "z",
+        }
+
+    printedforpath=[]
+
+    def getPath(self, base):
+        return "%s/%s" % (base, PATH)
+
+    def getTablename(self):
+        return "hws_points"
+
+    def getName(self):
+        return "HWS_POINTS"
+
+    def isGeometryValid(self, geomType):
+        return geomType == ogr.wkbPoint or geomType == ogr.wkbPoint25D
+
+    def isShapeRelevant(self, name, path):
+        shp = ogr.Open(path)
+        return self.isGeometryValid(shp.GetLayerByName(name).GetGeomType())
+
+    def getFedStateIDfromPath(self, path):
+        """
+        Tries to get extract a bundesland from the path
+        """
+        for state in sorted(FED_STATES.keys(), key = len, reverse = True):
+            if state in path.lower():
+                if not path in self.printedforpath:
+                    logger.info("Extracted federal state from path: %s" % state)
+                    self.printedforpath.append(path)
+                return FED_STATES[state]
+
+    def createNewFeature(self, featureDef, feat, **args):
+        newFeat  = ogr.Feature(featureDef)
+        geometry = feat.GetGeometryRef()
+        geometry.SetCoordinateDimension(2)
+
+        self.copyFields(feat, newFeat, self.fieldmap)
+
+        newFeat.SetGeometry(geometry)
+
+        artname = self.searchField("art$")
+        if self.IsFieldSet(feat, artname):
+            self.handled(artname)
+            kind_id = HWS_KIND.get(feat.GetField(artname).lower())
+            if not kind_id:
+                logger.warn("Unknown Art: %s" % \
+                        feat.GetField(artname))
+            else:
+                newFeat.SetField("kind_id", kind_id)
+
+        fname = self.searchField("Bundesland$")
+        if self.IsFieldSet(feat, fname):
+            self.handled(fname)
+            fed_id = FED_STATES.get(feat.GetField(fname).lower())
+
+            if not fed_id:
+                logger.warn("Unknown Bundesland: %s" % \
+                        feat.GetField(fname))
+            else:
+                newFeat.SetField("fed_state_id", fed_id)
+        else:
+            # Try to get the bundesland from path
+            fed_id = self.getFedStateIDfromPath(args['path'])
+            if fed_id:
+                newFeat.SetField("fed_state_id", fed_id)
+
+        fname = self.searchField("(ufer$)|(flussseite$)")
+        if self.IsFieldSet(feat, fname):
+            self.handled(fname)
+            shoreString = feat.GetField(fname)
+            if "links" in shoreString.lower():
+                newFeat.SetField("shore_side", True)
+            elif "rechts" in shoreString.lower():
+                newFeat.SetField("shore_side", False)
+
+
+        fname = self.searchField("river_{0,1}id$")
+        if self.IsFieldSet(feat, fname):
+            self.handled(fname)
+            if feat.GetField(fname) != self.river_id:
+                logger.warn("River_id mismatch between shapefile and"
+                     " importer parameter.")
+            newFeat.SetField("river_id", feat.GetField(fname))
+        else:
+            newFeat.SetField("river_id", self.river_id)
+
+        fname = self.searchField("name$")
+        if not self.IsFieldSet(feat, fname):
+            newFeat.SetField("name", args['name'])
+
+        fname = self.searchField("offiziell$")
+        if self.IsFieldSet(feat, fname):
+            self.handled(fname)
+            offiziell = feat.GetField(fname)
+            if offiziell == "1" or offiziell == 1:
+                newFeat.SetField("official", True)
+            else:
+                newFeat.SetField("official", False)
+        # Set the official value based on the file name as a fallback
+        elif args.get("name", "").lower() == "rohre_und_sperren" or \
+                args.get("name", "").lower() == "rohre-und-sperren":
+             newFeat.SetField("official", True)
+
+        if self.IsFieldSet(newFeat, "z") and \
+            self.IsFieldSet(newFeat, "rated_level"):
+            fname = self.searchField("freibord(_m){0,1}$")
+            self.handled(fname)
+            z = newFeat.GetFieldAsDouble("z")
+            rl = newFeat.GetFieldAsDouble("rated_level")
+            newFeat.SetField("freeboard", z - rl)
+
+        return newFeat
+
+class HWSLines(HWSPoints):
+
+    # TODO: GEOM_target, GEOM_rated_level, dike_km_from, dike_km_to
+    fieldmap = {
+            "name$" : "name",
+            "quelle$" : "source",
+            "anmerkung$" : "description",
+            "stand$" : "status_date",
+            "verband$" : "agency",
+            "Bereich$" : "range",
+        }
 
     def getPath(self, base):
         return "%s/%s" % (base, PATH)
@@ -52,136 +204,26 @@
         return "HWS_LINES"
 
     def isGeometryValid(self, geomType):
-        return geomType == 2
+        return geomType in [ogr.wkbLineString,
+                            ogr.wkbLineString25D,
+                            ogr.wkbMultiLineString25D,
+                            ogr.wkbMultiLineString]
 
     def isShapeRelevant(self, name, path):
-        return True
-
-    def createNewFeature(self, featureDef, feat, **args):
-        newFeat  = ogr.Feature(featureDef)
-        geometry = feat.GetGeometryRef()
-        geometry.SetCoordinateDimension(2)
-
-        newFeat.SetGeometry(geometry)
-
-        if self.IsFieldSet(feat, "river_id"):
-            newFeat.SetField("river_id", feat.GetField("river_id"))
-        else:
-            newFeat.SetField("river_id", self.river_id)
-
-        if self.IsFieldSet(feat, "TYP"):
-            newFeat.SetField("type", feat.GetField("TYP"))
-
-        if self.IsFieldSet(feat, "Bauart"):
-            newFeat.SetField("hws_facility", feat.GetField("Bauart"))
-
-        if self.IsFieldSet(feat, "Name"):
-            newFeat.SetField("name", feat.GetField("name"))
-        else:
-            newFeat.SetField("name", args['name'])
-
-        return newFeat
-
-class HWSPoints(Importer):
-    fieldmap = {
-            "Name" : "name",
-            "Quelle" : "source",
-            "Anmerkung" : "description",
-            "Stand" : "status_date",
-            "Verband" : "agency",
-            "Deich_KM" : "dike_km",
-            "Bereich" : "range",
-            "Höhe_SOLL" : "z_target",
-            "WSP_BfG100" : "rated_level",
-            "Hoehe_IST" : "z",
-        }
-
-    def getPath(self, base):
-        return "%s/%s" % (base, PATH)
-
-    def getTablename(self):
-        return "hws_points"
-
-    def getName(self):
-        return "HWS_POINTS"
-
-    def isGeometryValid(self, geomType):
-        return geomType == 1
-
-    def isShapeRelevant(self, name, path):
-        if "punkte" in os.path.basename(path).lower():
-            return True
-        else:
-            return False
+        shp = ogr.Open(path)
+        return self.isGeometryValid(shp.GetLayerByName(name).GetGeomType())
 
     def createNewFeature(self, featureDef, feat, **args):
-        newFeat  = ogr.Feature(featureDef)
+        newFeat = HWSPoints.createNewFeature(self, featureDef, feat, **args)
         geometry = feat.GetGeometryRef()
-        geometry.SetCoordinateDimension(2)
-
-        self.copyFields(feat, newFeat, self.fieldmap)
-
+        if geometry.GetCoordinateDimension() == 2:
+            geometry.SetCoordinateDimension(3)
+            for i in range(0, geometry.GetPointCount()):
+                x,y,z = geometry.GetPoint(i)
+                z = 9999
+                geometry.SetPoint(i, x, y, z)
         newFeat.SetGeometry(geometry)
 
-        newFeat.SetFID(feat.GetFID())
-
-        newFeat.SetField("ogr_fid", feat.GetFID())
-
-        if self.IsFieldSet(feat, "Art"):
-            self.handled("Art")
-            kind_id = HWS_KIND.get(feat.GetField("Art"))
-            if not kind_id:
-                print ("Unbekannte Art: %s" % \
-                        feat.GetField("Art"))
-            else:
-                newFeat.SetField("kind_id", kind_id)
-
-        if self.IsFieldSet(feat, "Bundesland"):
-            self.handled("Bundesland")
-            fed_id = FED_STATES.get(feat.GetField("Bundesland"))
-
-            if not fed_id:
-                print ("Unbekanntes Bundesland: %s" % \
-                        feat.GetField("Bundesland"))
-            else:
-                newFeat.SetField("fed_state_id", fed_id)
-
-        if self.IsFieldSet(feat, "river_id"):
-            self.handled("river_id")
-            if feat.GetField("river_id") != self.river_id:
-                print ("River_id mismatch between shapefile and"
-                     " importer parameter.")
-            newFeat.SetField("river_id", feat.GetField("river_id"))
-        else:
-            newFeat.SetField("river_id", self.river_id)
-
-        if self.IsFieldSet(feat, "Ufer"):
-            self.handled("Ufer")
-            shoreString = feat.GetField("Ufer")
-            if "links" in shoreString.lower():
-                newFeat.SetField("shore_side", True)
-            elif "rechts" in shoreString.lower():
-                newFeat.SetField("shore_side", False)
-
-        if not self.IsFieldSet(feat, "Name"):
-            self.handled("Name")
-            newFeat.SetField("name", args['name'])
-
-        if self.IsFieldSet(feat, "offiziell"):
-            self.handled("offiziell")
-            offiziell = feat.GetField("offiziell")
-            if offiziell == "1" or offiziell == 1:
-                newFeat.SetField("offiziell", True)
-            else:
-                newFeat.SetField("offiziell", False)
-
-        if self.IsFieldSet(newFeat, "z") and \
-            self.IsFieldSet(newFeat, "rated_level"):
-            self.handled("Freibord_m")
-            z = newFeat.GetFieldAsDouble("z")
-            rl = newFeat.GetFieldAsDouble("rated_level")
-            newFeat.SetField("freeboard", z - rl)
-
-        return newFeat
+        return utils.convertToMultiLine(newFeat)
 
 

http://dive4elements.wald.intevation.org