Mercurial > dive4elements > river
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)