parse.py - randomcrap - random crap programs of varying quality
(HTM) git clone git://git.codemadness.org/randomcrap
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
parse.py (3077B)
---
1 # NOTE: may be insecure due to underlying libexpat version, see:
2 # https://docs.python.org/3/library/xml.html "XML vulnerabilities" listing.
3
4 import xml.etree.ElementTree as ET
5
6 # "Rijksdriehoek" to WGS84 (lat, lon) coordinate.
7 # "Benaderingsformules voor de transformatie tussen RD- en WGS84-kaartcoordinaten" - https://docplayer.nl/7261923-a.html
8 def rd2latlon(x, y):
9 # Central reference point "Rijksdriehoek" coordinate:
10 # "Onze Lieve Vrouwetoren ('Lange Jan') in Amersfoort.
11 refrdx = 155000
12 refrdy = 463000
13
14 dx = (x - refrdx) * 0.000010
15 dy = (y - refrdy) * 0.000010
16
17 # reduce duplicate calculations.
18 px2 = dx * dx
19 py2 = dy * dy
20 px3 = px2 * dx
21 py3 = py2 * dy
22 px4 = px3 * dx
23 py4 = py3 * dy
24 px5 = px4 * dx
25
26 sumn = \
27 (3235.65389 * dy) + \
28 (-32.58297 * px2) + \
29 (-0.2475 * py2) + \
30 (-0.84978 * px2 * dy) + \
31 (-0.0655 * py3) + \
32 (-0.01709 * px2 * py2) + \
33 (-0.00738 * dx) + \
34 (0.0053 * px4) + \
35 (-0.00039 * px2 * py3) + \
36 (0.00033 * px4 * dy) + \
37 (-0.00012 * dx * dy)
38 sume = \
39 (5260.52916 * dx) + \
40 (105.94684 * dx * dy) + \
41 (2.45656 * dx * py2) + \
42 (-0.81885 * px3) + \
43 (0.05594 * dx * px3) + \
44 (-0.05607 * px3 * dy) + \
45 (0.01199 * dy) + \
46 (-0.00256 * px3 * py2) + \
47 (0.00128 * dx * py4) + \
48 (0.00022 * py2) + \
49 (-0.00022 * px2) + \
50 (0.00026 * px5)
51
52 # (lat, lon) reference point WGS84 coordinate.
53 return [52.15517 + (sumn / 3600), 5.387206 + (sume / 3600) ]
54
55 #if __name__ == "__main__":
56 # lat, lon = rd2latlon(122202, 487250)
57 # print("%.17g, %.17g\n" % (lat, lon))
58
59
60 def getint(s, _def):
61 i = _def
62 try:
63 i = int(s)
64 except:
65 i = _def
66 return i
67
68 def printinfo(o, eventtype, subscriberid):
69 ns = {"tmi8": "http://bison.connekt.nl/tmi8/kv6/msg"}
70 els = {}
71 t = {}
72 for e in ["rd-x", "rd-y", "lineplanningnumber", "journeynumber", "userstopcode",
73 "timestamp", "source", "vehiclenumber", "punctuality", "dataownercode",
74 "distancesincelastuserstop"]:
75 el = o.find("tmi8:" + e, ns)
76 els[e] = el
77 try:
78 t[e] = el.text
79 except:
80 t[e] = ""
81 rdx = t["rd-x"]
82 rdy = t["rd-y"]
83 timestamp = t["timestamp"]
84 rdx = getint(rdx, -1)
85 rdy = getint(rdy, -1)
86 lineplanningnumber = t["lineplanningnumber"]
87 journeynumber = t["journeynumber"]
88 vehiclenumber = t["vehiclenumber"]
89 source = t["source"]
90 if rdx != -1 and rdy != -1:
91 print("%s: %s, event: %s, lineplanning#: %s, vehicle#: %s, journey#: %s, source: %s, lat/lon: %s" %
92 (timestamp, subscriberid, eventtype,
93 lineplanningnumber,
94 vehiclenumber,
95 journeynumber,
96 source,
97 rd2latlon(rdx, rdy)))
98
99
100 if __name__ == "__main__":
101 ns = {"tmi8": "http://bison.connekt.nl/tmi8/kv6/msg"}
102 tree = ET.parse("/dev/stdin")
103 root = tree.getroot()
104 subscriberid = root.find("tmi8:SubscriberID", ns).text
105
106 p = root.find("tmi8:KV6posinfo", ns)
107 # types, see:
108 # http://data.ndovloket.nl/docs/bison/kv6/TMI8%20Actuele%20ritpunctualiteit%20en%20voertuiginformatie%20(kv%206),%20v8.1.2.0,%20release.pdf
109 for t in ["ARRIVAL", "DELAY", "DEPARTURE", "END", "INIT", "OFFROUTE", "ONROUTE", "ONSTOP"]:
110 for o in p.findall("tmi8:" + t, ns):
111 printinfo(o, t, subscriberid)