Add import_gpx.py.
This commit is contained in:
parent
d2eb6ccde4
commit
6a780d3e46
1 changed files with 88 additions and 0 deletions
88
import_gpx.py
Normal file
88
import_gpx.py
Normal file
|
@ -0,0 +1,88 @@
|
|||
import argparse
|
||||
import bs4
|
||||
import dateutil.parser
|
||||
import sqlite3
|
||||
import sys
|
||||
|
||||
from voussoirkit import betterhelp
|
||||
from voussoirkit import pathclass
|
||||
from voussoirkit import vlogging
|
||||
|
||||
log = vlogging.getLogger(__name__, 'import_gpx')
|
||||
|
||||
def import_gpx_argparse(args):
|
||||
gpxs = pathclass.glob_many_files(args.patterns)
|
||||
sql = sqlite3.connect(args.dbfile)
|
||||
for gpx in gpxs:
|
||||
print(gpx.absolute_path)
|
||||
soup = bs4.BeautifulSoup(gpx.read('r'), 'xml')
|
||||
if soup.gpx.metadata and soup.gpx.metadata.device:
|
||||
device_id = soup.gpx.metadata.device.text
|
||||
else:
|
||||
device_id = 'import_gpx'
|
||||
for trkpt in soup.find_all('trkpt'):
|
||||
lat = trkpt['lat']
|
||||
lon = trkpt['lon']
|
||||
provider = 'gps'
|
||||
if trkpt.unix:
|
||||
time = int(trkpt.unix.text)
|
||||
else:
|
||||
time = int(dateutil.parser.parse(trkpt.time.text).timestamp() * 1000)
|
||||
if trkpt.accuracy:
|
||||
accuracy = trkpt.accuracy.text
|
||||
else:
|
||||
accuracy = None
|
||||
if trkpt.ele:
|
||||
ele = trkpt.ele.text
|
||||
else:
|
||||
ele = None
|
||||
if trkpt.sat:
|
||||
sat = trkpt.sat.text
|
||||
else:
|
||||
sat = None
|
||||
bindings = [
|
||||
device_id,
|
||||
time,
|
||||
lat,
|
||||
lon,
|
||||
provider,
|
||||
accuracy,
|
||||
ele,
|
||||
sat,
|
||||
]
|
||||
try:
|
||||
sql.execute('INSERT INTO trkpt (device_id, time, lat, lon, provider, accuracy, ele, sat) VALUES(?, ?, ?, ?, ?, ?, ?, ?)', bindings)
|
||||
except sqlite3.IntegrityError:
|
||||
pass
|
||||
sql.commit()
|
||||
return 0
|
||||
|
||||
@vlogging.main_decorator
|
||||
def main(argv):
|
||||
parser = argparse.ArgumentParser(
|
||||
description='''
|
||||
This program can import your existing GPX files into a trkpt database.
|
||||
|
||||
Make sure you stop and close trkpt before modifying the database so
|
||||
that the changes don't clash with an ongoing recording.
|
||||
''',
|
||||
)
|
||||
parser.add_argument(
|
||||
'dbfile',
|
||||
help='''
|
||||
Path to the .db file.
|
||||
''',
|
||||
)
|
||||
parser.add_argument(
|
||||
'patterns',
|
||||
nargs='+',
|
||||
help='''
|
||||
One or more glob patterns that will match your .gpx files.
|
||||
''',
|
||||
)
|
||||
parser.set_defaults(func=import_gpx_argparse)
|
||||
|
||||
return betterhelp.go(parser, argv)
|
||||
|
||||
if __name__ == '__main__':
|
||||
raise SystemExit(main(sys.argv[1:]))
|
Loading…
Reference in a new issue