]> www.average.org Git - loctrkd.git/blob - loctrkd/mkgpx.py
Update changelog for 2.00 release
[loctrkd.git] / loctrkd / mkgpx.py
1 """ Example that produces gpx from events in evstore """
2
3 # run as:
4 # python -m loctrkd.mkgpx <IMEI>
5 # Generated gpx is emitted to stdout
6
7 from configparser import ConfigParser
8 from datetime import datetime, timezone
9 from getopt import getopt
10 from importlib import import_module
11 from logging import getLogger
12 from sqlite3 import connect
13 from sys import argv
14 from typing import Any, cast, List, Tuple
15
16 from . import common
17 from .protomodule import ProtoModule
18
19 log = getLogger("loctrkd/mkgpx")
20
21
22 def main(
23     conf: ConfigParser, opts: List[Tuple[str, str]], args: List[str]
24 ) -> None:
25     db = connect(conf.get("storage", "dbfn"))
26     c = db.cursor()
27     c.execute(
28         """select tstamp, is_incoming, proto, packet from events
29            where imei = ?  and is_incoming = true
30            and proto in (?, ?)
31            order by tstamp""",
32         (args[0], "BS:UD", "BS:UD2"),
33     )
34     print(
35         """<?xml version="1.0"?>
36     <gpx version="1.1"
37     creator="loctrkd"
38     xmlns="http://www.topografix.com/GPX/1/1">
39       <name>Location Data</name>
40       <trk>
41         <name>Location Data</name>
42         <trkseg>
43     """
44     )
45
46     for tstamp, is_incoming, proto, packet in c:
47         pmod = common.pmod_for_proto(proto)
48         if pmod is not None:
49             msg = pmod.parse_message(packet, is_incoming=is_incoming)
50         lat, lon = msg.latitude, msg.longitude
51         isotime = (
52             datetime.fromtimestamp(tstamp)
53             .astimezone(tz=timezone.utc)
54             .isoformat()
55         )
56         isotime = isotime[: isotime.rfind(".")] + "Z"
57         trkpt = """      <trkpt lat="{}" lon="{}">
58               <time>{}</time>
59           </trkpt>""".format(
60             lat, lon, isotime
61         )
62         print(trkpt)
63         if False:
64             print(
65                 datetime.fromtimestamp(tstamp)
66                 .astimezone(tz=timezone.utc)
67                 .isoformat(),
68                 msg,
69             )
70     print(
71         """    </trkseg>
72       </trk>
73     </gpx>"""
74     )
75
76
77 if __name__.endswith("__main__"):
78     opts, args = getopt(argv[1:], "o:c:d")
79     main(common.init(log, opts=opts), opts, args)