Mercurial > dive4elements > river
comparison flys-backend/contrib/shpimporter/uesg.py @ 2853:bd9e76e0b55d
Improved the python shapefile importer.
flys-backend/trunk@4313 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Fri, 27 Apr 2012 06:39:12 +0000 |
parents | 5a654f2e35bc |
children | b0132e1b9719 |
comparison
equal
deleted
inserted
replaced
2852:875a87b8489f | 2853:bd9e76e0b55d |
---|---|
1 import ogr | 1 import ogr |
2 | 2 |
3 from importer import Importer | |
4 | |
5 | |
3 TABLE_NAME="floodmaps" | 6 TABLE_NAME="floodmaps" |
7 PATH="Hydrologie/UeSG/Berechnung" | |
4 | 8 |
5 class UESG: | |
6 | 9 |
7 def __init__(self, dbconn): | 10 class UESG(Importer): |
8 self.dbconn = dbconn | 11 |
12 def getPath(self, base): | |
13 return "%s/%s" % (base, PATH) | |
14 | |
15 | |
16 def getTablename(self): | |
17 return TABLE_NAME | |
9 | 18 |
10 | 19 |
11 def isGeometryValid(self, geomType): | 20 def isGeometryValid(self, geomType): |
12 if geomType == 3 or geomType == 6: | 21 if geomType == 3 or geomType == 6: |
13 return True | 22 return True |
33 kind = kind + 200 | 42 kind = kind + 200 |
34 | 43 |
35 return kind | 44 return kind |
36 | 45 |
37 | 46 |
38 def walkOverShapes(self, shape): | 47 def createNewFeature(self, featureDef, feat, **args): |
39 (name, path) = shape | 48 kind = self.getKind(args['path']) |
40 shp = ogr.Open(shape[1]) | |
41 if shp is None: | |
42 print "Shapefile '%s' could not be opened!" % path | |
43 return | |
44 | 49 |
45 print "Opened shapefile '%s'" % path | |
46 srcLayer = shp.GetLayerByName(name) | |
47 | |
48 if srcLayer is None: | |
49 print "Layer '%s' was not found!" % name | |
50 return | |
51 | |
52 return self.shape2Database(srcLayer, name, self.getKind(path)) | |
53 | |
54 | |
55 def shape2Database(self, srcLayer, name, kind): | |
56 table = ogr.Open(self.dbconn) | |
57 destLayer = table.GetLayerByName(TABLE_NAME) | |
58 | |
59 if srcLayer is None: | |
60 print "Shapefile is None!" | |
61 return -1 | |
62 | |
63 if destLayer is None: | |
64 print "No destination layer given!" | |
65 return -1 | |
66 | |
67 count = srcLayer.GetFeatureCount() | |
68 print "Try to add %i features to database." % count | |
69 | |
70 srcLayer.ResetReading() | |
71 | |
72 geomType = -1 | |
73 | |
74 featureDef = destLayer.GetLayerDefn() | |
75 | |
76 for feat in srcLayer: | |
77 geom = feat.GetGeometryRef() | |
78 geomType = geom.GetGeometryType() | |
79 | |
80 newFeat = self.createNewFeature(featureDef, feat) | |
81 newFeat.SetField("kind", kind) | |
82 newFeat.SetField("name", name) | |
83 | |
84 if self.isGeometryValid(geomType): | |
85 res = destLayer.CreateFeature(newFeat) | |
86 if res is None or res > 0: | |
87 print "Error while inserting feature: %r" % res | |
88 else: | |
89 print "Geometry type not supported: %i" % geomType | |
90 | |
91 try: | |
92 destLayer.CommitTransaction() | |
93 except e: | |
94 print "Exception while committing transaction." | |
95 | |
96 return geomType | |
97 | |
98 | |
99 def createNewFeature(self, featureDef, feat): | |
100 newFeat = ogr.Feature(featureDef) | 50 newFeat = ogr.Feature(featureDef) |
101 newFeat.SetGeometry(feat.GetGeometryRef()) | 51 newFeat.SetGeometry(feat.GetGeometryRef()) |
102 | 52 |
103 if feat.IsFieldSet("river_id"): | 53 if self.IsFieldSet(feat, "river_id"): |
104 riverId = feat.GetField("river_id") | 54 riverId = feat.GetField(feat) |
105 else: | 55 else: |
106 riverId = 1 | 56 riverId = self.river_id |
107 | 57 |
108 if feat.IsFieldSet("diff"): | 58 if feat.IsFieldSet("diff"): |
109 diff = feat.GetFieldAsDouble("diff") | 59 diff = feat.GetFieldAsDouble("diff") |
110 else: | 60 else: |
111 diff = 0 | 61 diff = 0 |
130 newFeat.SetField("river_id", riverId) | 80 newFeat.SetField("river_id", riverId) |
131 newFeat.SetField("diff", diff) | 81 newFeat.SetField("diff", diff) |
132 newFeat.SetField("count", count) | 82 newFeat.SetField("count", count) |
133 newFeat.SetField("area", area) | 83 newFeat.SetField("area", area) |
134 newFeat.SetField("perimeter", perimeter) | 84 newFeat.SetField("perimeter", perimeter) |
85 newFeat.SetField("kind", kind) | |
86 newFeat.SetField("name", args['name']) | |
135 | 87 |
136 return newFeat | 88 return newFeat |
137 | 89 |