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)