comparison 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
comparison
equal deleted inserted replaced
5175:cfc5540a4eec 5379:61bf64b102bc
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 import os 2 import os
3 3
4 try: 4 try:
5 from osgeo import ogr 5 from osgeo import ogr
6 except ImportErrror: 6 except ImportError:
7 import ogr 7 import ogr
8 8
9 from importer import Importer 9 from importer import Importer
10 import utils 10 import utils
11 11
12 import logging
13 logger = logging.getLogger("HWS")
14
12 PATH="Hydrologie/HW-Schutzanlagen" 15 PATH="Hydrologie/HW-Schutzanlagen"
13 NAME="HWS" 16 NAME="HWS"
14 17
15 # Keep in sync with hws_kinds table: 18 # Keep in sync with hws_kinds table:
19 # strings need to be lowercase
16 HWS_KIND = { 20 HWS_KIND = {
17 "Durchlass" : 1, 21 "durchlass" : 1,
18 "Damm" : 2, 22 "damm" : 2,
19 "Deich" : 2, 23 "deich" : 2,
20 "Graben" : 3, 24 "hochufer" : 2,
25 "graben" : 3,
26 "rohr1" : 1,
27 "rohr 1" : 1,
28 "rohr 2" : 1,
29 "hauptdeich" : 2,
30 "sommerdeich" : 2
21 } 31 }
22 32
23 # Keep in sync with fed_states table: 33 # Keep in sync with fed_states table:
34 # strings need to be lowercase
24 FED_STATES = { 35 FED_STATES = {
25 "Bayern" : 1, 36 "bayern" : 1,
26 "Hessen" : 2, 37 "hessen" : 2,
27 "Niedersachsen" : 3, 38 "niedersachsen" : 3,
28 "Nordrhein-Westfalen" : 4, 39 "nordrhein-westfalen" : 4,
29 "Rheinland-Pfalz" : 5, 40 "nordrhein westfalen" : 4,
30 "Saarland" : 6, 41 "rheinland-pfalz" : 5,
31 "Schleswig-Holstein" : 7, 42 "rheinland pfalz" : 5,
32 "Brandenburg" : 8, 43 "saarland" : 6,
33 "Mecklenburg-Vorpommern" : 9, 44 "schleswig-holstein" : 7,
34 "Thüringen" : 10, 45 "schleswig holstein" : 7,
35 "Baden-Württemberg" : 11, 46 "brandenburg" : 8,
36 "Sachsen-Anhalt" : 12, 47 "mecklenburg-vorpommern" : 9,
37 "Sachsen" : 13, 48 "mecklenburg vorpommern" : 9,
38 "Berlin" : 14, 49 "thüringen" : 10,
39 "Bremen" : 15, 50 "baden-württemberg" : 11,
40 "Hamburg" : 16, 51 "baden württemberg" : 11,
52 "sachsen-anhalt" : 12,
53 "sachsen anhalt" : 12,
54 "sachsen" : 13,
55 "berlin" : 14,
56 "bremen" : 15,
57 "hamburg" : 16,
41 } 58 }
42 59
43 class HWSLines(Importer): 60 class HWSPoints(Importer):
61 fieldmap = {
62 "name$" : "name",
63 "quelle$" : "source",
64 "anmerkung$" : "description",
65 "stand$" : "status_date",
66 "verband$" : "agency",
67 "Deich_{0,1}KM$" : "dike_km",
68 "Bereich$" : "range",
69 "H[oeö]{0,2}he_{0,1}SOLL$" : "z_target",
70 "(WSP_){0,1}BfG_{0,1}100$" : "rated_level",
71 "H[oeö]{0,2}he_{0,1}IST$" : "z",
72 }
73
74 printedforpath=[]
44 75
45 def getPath(self, base): 76 def getPath(self, base):
46 return "%s/%s" % (base, PATH) 77 return "%s/%s" % (base, PATH)
47 78
48 def getTablename(self): 79 def getTablename(self):
49 return "hws_lines" 80 return "hws_points"
50 81
51 def getName(self): 82 def getName(self):
52 return "HWS_LINES" 83 return "HWS_POINTS"
53 84
54 def isGeometryValid(self, geomType): 85 def isGeometryValid(self, geomType):
55 return geomType == 2 86 return geomType == ogr.wkbPoint or geomType == ogr.wkbPoint25D
56 87
57 def isShapeRelevant(self, name, path): 88 def isShapeRelevant(self, name, path):
58 return True 89 shp = ogr.Open(path)
90 return self.isGeometryValid(shp.GetLayerByName(name).GetGeomType())
91
92 def getFedStateIDfromPath(self, path):
93 """
94 Tries to get extract a bundesland from the path
95 """
96 for state in sorted(FED_STATES.keys(), key = len, reverse = True):
97 if state in path.lower():
98 if not path in self.printedforpath:
99 logger.info("Extracted federal state from path: %s" % state)
100 self.printedforpath.append(path)
101 return FED_STATES[state]
59 102
60 def createNewFeature(self, featureDef, feat, **args): 103 def createNewFeature(self, featureDef, feat, **args):
61 newFeat = ogr.Feature(featureDef) 104 newFeat = ogr.Feature(featureDef)
62 geometry = feat.GetGeometryRef() 105 geometry = feat.GetGeometryRef()
63 geometry.SetCoordinateDimension(2) 106 geometry.SetCoordinateDimension(2)
64 107
108 self.copyFields(feat, newFeat, self.fieldmap)
109
65 newFeat.SetGeometry(geometry) 110 newFeat.SetGeometry(geometry)
66 111
67 if self.IsFieldSet(feat, "river_id"): 112 artname = self.searchField("art$")
68 newFeat.SetField("river_id", feat.GetField("river_id")) 113 if self.IsFieldSet(feat, artname):
69 else: 114 self.handled(artname)
70 newFeat.SetField("river_id", self.river_id) 115 kind_id = HWS_KIND.get(feat.GetField(artname).lower())
71
72 if self.IsFieldSet(feat, "TYP"):
73 newFeat.SetField("type", feat.GetField("TYP"))
74
75 if self.IsFieldSet(feat, "Bauart"):
76 newFeat.SetField("hws_facility", feat.GetField("Bauart"))
77
78 if self.IsFieldSet(feat, "Name"):
79 newFeat.SetField("name", feat.GetField("name"))
80 else:
81 newFeat.SetField("name", args['name'])
82
83 return newFeat
84
85 class HWSPoints(Importer):
86 fieldmap = {
87 "Name" : "name",
88 "Quelle" : "source",
89 "Anmerkung" : "description",
90 "Stand" : "status_date",
91 "Verband" : "agency",
92 "Deich_KM" : "dike_km",
93 "Bereich" : "range",
94 "Höhe_SOLL" : "z_target",
95 "WSP_BfG100" : "rated_level",
96 "Hoehe_IST" : "z",
97 }
98
99 def getPath(self, base):
100 return "%s/%s" % (base, PATH)
101
102 def getTablename(self):
103 return "hws_points"
104
105 def getName(self):
106 return "HWS_POINTS"
107
108 def isGeometryValid(self, geomType):
109 return geomType == 1
110
111 def isShapeRelevant(self, name, path):
112 if "punkte" in os.path.basename(path).lower():
113 return True
114 else:
115 return False
116
117 def createNewFeature(self, featureDef, feat, **args):
118 newFeat = ogr.Feature(featureDef)
119 geometry = feat.GetGeometryRef()
120 geometry.SetCoordinateDimension(2)
121
122 self.copyFields(feat, newFeat, self.fieldmap)
123
124 newFeat.SetGeometry(geometry)
125
126 newFeat.SetFID(feat.GetFID())
127
128 newFeat.SetField("ogr_fid", feat.GetFID())
129
130 if self.IsFieldSet(feat, "Art"):
131 self.handled("Art")
132 kind_id = HWS_KIND.get(feat.GetField("Art"))
133 if not kind_id: 116 if not kind_id:
134 print ("Unbekannte Art: %s" % \ 117 logger.warn("Unknown Art: %s" % \
135 feat.GetField("Art")) 118 feat.GetField(artname))
136 else: 119 else:
137 newFeat.SetField("kind_id", kind_id) 120 newFeat.SetField("kind_id", kind_id)
138 121
139 if self.IsFieldSet(feat, "Bundesland"): 122 fname = self.searchField("Bundesland$")
140 self.handled("Bundesland") 123 if self.IsFieldSet(feat, fname):
141 fed_id = FED_STATES.get(feat.GetField("Bundesland")) 124 self.handled(fname)
125 fed_id = FED_STATES.get(feat.GetField(fname).lower())
142 126
143 if not fed_id: 127 if not fed_id:
144 print ("Unbekanntes Bundesland: %s" % \ 128 logger.warn("Unknown Bundesland: %s" % \
145 feat.GetField("Bundesland")) 129 feat.GetField(fname))
146 else: 130 else:
147 newFeat.SetField("fed_state_id", fed_id) 131 newFeat.SetField("fed_state_id", fed_id)
148
149 if self.IsFieldSet(feat, "river_id"):
150 self.handled("river_id")
151 if feat.GetField("river_id") != self.river_id:
152 print ("River_id mismatch between shapefile and"
153 " importer parameter.")
154 newFeat.SetField("river_id", feat.GetField("river_id"))
155 else: 132 else:
156 newFeat.SetField("river_id", self.river_id) 133 # Try to get the bundesland from path
157 134 fed_id = self.getFedStateIDfromPath(args['path'])
158 if self.IsFieldSet(feat, "Ufer"): 135 if fed_id:
159 self.handled("Ufer") 136 newFeat.SetField("fed_state_id", fed_id)
160 shoreString = feat.GetField("Ufer") 137
138 fname = self.searchField("(ufer$)|(flussseite$)")
139 if self.IsFieldSet(feat, fname):
140 self.handled(fname)
141 shoreString = feat.GetField(fname)
161 if "links" in shoreString.lower(): 142 if "links" in shoreString.lower():
162 newFeat.SetField("shore_side", True) 143 newFeat.SetField("shore_side", True)
163 elif "rechts" in shoreString.lower(): 144 elif "rechts" in shoreString.lower():
164 newFeat.SetField("shore_side", False) 145 newFeat.SetField("shore_side", False)
165 146
166 if not self.IsFieldSet(feat, "Name"): 147
167 self.handled("Name") 148 fname = self.searchField("river_{0,1}id$")
149 if self.IsFieldSet(feat, fname):
150 self.handled(fname)
151 if feat.GetField(fname) != self.river_id:
152 logger.warn("River_id mismatch between shapefile and"
153 " importer parameter.")
154 newFeat.SetField("river_id", feat.GetField(fname))
155 else:
156 newFeat.SetField("river_id", self.river_id)
157
158 fname = self.searchField("name$")
159 if not self.IsFieldSet(feat, fname):
168 newFeat.SetField("name", args['name']) 160 newFeat.SetField("name", args['name'])
169 161
170 if self.IsFieldSet(feat, "offiziell"): 162 fname = self.searchField("offiziell$")
171 self.handled("offiziell") 163 if self.IsFieldSet(feat, fname):
172 offiziell = feat.GetField("offiziell") 164 self.handled(fname)
165 offiziell = feat.GetField(fname)
173 if offiziell == "1" or offiziell == 1: 166 if offiziell == "1" or offiziell == 1:
174 newFeat.SetField("offiziell", True) 167 newFeat.SetField("official", True)
175 else: 168 else:
176 newFeat.SetField("offiziell", False) 169 newFeat.SetField("official", False)
170 # Set the official value based on the file name as a fallback
171 elif args.get("name", "").lower() == "rohre_und_sperren" or \
172 args.get("name", "").lower() == "rohre-und-sperren":
173 newFeat.SetField("official", True)
177 174
178 if self.IsFieldSet(newFeat, "z") and \ 175 if self.IsFieldSet(newFeat, "z") and \
179 self.IsFieldSet(newFeat, "rated_level"): 176 self.IsFieldSet(newFeat, "rated_level"):
180 self.handled("Freibord_m") 177 fname = self.searchField("freibord(_m){0,1}$")
178 self.handled(fname)
181 z = newFeat.GetFieldAsDouble("z") 179 z = newFeat.GetFieldAsDouble("z")
182 rl = newFeat.GetFieldAsDouble("rated_level") 180 rl = newFeat.GetFieldAsDouble("rated_level")
183 newFeat.SetField("freeboard", z - rl) 181 newFeat.SetField("freeboard", z - rl)
184 182
185 return newFeat 183 return newFeat
186 184
187 185 class HWSLines(HWSPoints):
186
187 # TODO: GEOM_target, GEOM_rated_level, dike_km_from, dike_km_to
188 fieldmap = {
189 "name$" : "name",
190 "quelle$" : "source",
191 "anmerkung$" : "description",
192 "stand$" : "status_date",
193 "verband$" : "agency",
194 "Bereich$" : "range",
195 }
196
197 def getPath(self, base):
198 return "%s/%s" % (base, PATH)
199
200 def getTablename(self):
201 return "hws_lines"
202
203 def getName(self):
204 return "HWS_LINES"
205
206 def isGeometryValid(self, geomType):
207 return geomType in [ogr.wkbLineString,
208 ogr.wkbLineString25D,
209 ogr.wkbMultiLineString25D,
210 ogr.wkbMultiLineString]
211
212 def isShapeRelevant(self, name, path):
213 shp = ogr.Open(path)
214 return self.isGeometryValid(shp.GetLayerByName(name).GetGeomType())
215
216 def createNewFeature(self, featureDef, feat, **args):
217 newFeat = HWSPoints.createNewFeature(self, featureDef, feat, **args)
218 geometry = feat.GetGeometryRef()
219 if geometry.GetCoordinateDimension() == 2:
220 geometry.SetCoordinateDimension(3)
221 for i in range(0, geometry.GetPointCount()):
222 x,y,z = geometry.GetPoint(i)
223 z = 9999
224 geometry.SetPoint(i, x, y, z)
225 newFeat.SetGeometry(geometry)
226
227 return utils.convertToMultiLine(newFeat)
228
229

http://dive4elements.wald.intevation.org