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