source: osm/applications/editors/josm/plugins/lakewalker/Lakewalker/OSMReader.py@ 10119

Last change on this file since 10119 was 4096, checked in by brent, 17 years ago

v0.3 with latest python module

File size: 2.9 KB
Line 
1import xml.sax
2import OSM
3
4(EMPTY, ROOT, NODE, SEGMENT, WAY) = range(5)
5
6class OSMReader(xml.sax.handler.ContentHandler):
7 def __init__(self):
8 self.state = EMPTY
9 self.obj = None
10 self.nodeHandler = None
11 self.segmentHandler = None
12 self.wayHandler = None
13 self.tagHandler = None
14
15 def run(self, f):
16 self.state = EMPTY
17 self.obj = None
18 parser = xml.sax.make_parser()
19 parser.setContentHandler(self)
20 parser.parse(f)
21
22 def startElement(self, name, attrs):
23 if name == "node":
24 if self.state != ROOT:
25 raise Exception("Got node in %d state" % self.state)
26 self.state = NODE
27 node_id = int(attrs["id"])
28 lat = float(attrs["lat"])
29 lon = float(attrs["lon"])
30 timestamp = attrs.get("timestamp", None)
31 self.obj = OSM.Node(node_id, lat, lon, timestamp)
32 elif name == "tag":
33 if self.obj is None:
34 raise Exception("Got tag when not inside any object")
35 k = attrs.get("k")
36 v = attrs.get("v")
37 self.obj.tags[k] = v
38 if self.tagHandler:
39 self.tagHandler(k, v)
40 elif name == "segment":
41 if self.state != ROOT:
42 raise Exception("Got segment in %d state" % self.state)
43 self.state = SEGMENT
44 self.obj = OSM.Segment(attrs)
45 elif name == "way":
46 if self.state != ROOT:
47 raise Exception("Got way in %d state" % self.state)
48 self.state = WAY
49 self.obj = OSM.Way(attrs)
50 elif name == "seg":
51 if self.state != WAY:
52 raise Exception("Got seg in state %d!" % self.state)
53 self.obj.segs.append(int(attrs["id"]))
54 elif name == "osm":
55 if self.state != EMPTY:
56 raise Exception("Got osm in %d state" % self.state)
57 self.state = ROOT
58
59 def endElement(self, name):
60 if name == "node":
61 if self.state != NODE:
62 raise Exception("Got /node in state %d!" % self.state)
63 if self.nodeHandler:
64 self.nodeHandler(self.obj)
65 self.obj = None
66 self.state = ROOT
67 elif name == "segment":
68 if self.state != SEGMENT:
69 raise Exception("Got /segment in state %d!" % self.state)
70 if self.segmentHandler:
71 self.segmentHandler(self.obj)
72 self.obj = None
73 self.state = ROOT
74 elif name == "way":
75 if self.state != WAY:
76 raise Exception("Got /way in state %d!" % self.state)
77 if self.wayHandler:
78 self.wayHandler(self.obj)
79 self.obj = None
80 self.state = ROOT
81 elif name == "osm":
82 if self.state != ROOT:
83 raise Exception("Got /osm in state %d!" % self.state)
84 self.state = EMPTY
Note: See TracBrowser for help on using the repository browser.