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

http://dive4elements.wald.intevation.org