diff --git a/README.md b/README.md index 28a973e..bbb692a 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,9 @@ available commands: [gateway] run Run the aprs client. - [igcexport] - write Export igc file for
at . + [export] + cup Export receiver waypoints as '.cup'. + igc Export igc file for
at . [logbook] compute_logbook Compute logbook. diff --git a/ogn/commands/__init__.py b/ogn/commands/__init__.py index 04719ca..2ce4e2f 100644 --- a/ogn/commands/__init__.py +++ b/ogn/commands/__init__.py @@ -1,6 +1,6 @@ from .database import manager as database_manager from .bulkimport import manager as bulkimport_manager -from .igcexport import manager as igcexport_manager +from .export import manager as export_manager from .logbook import manager as logbook_manager from .stats import manager as stats_manager from .flights import manager as flights_manager @@ -11,7 +11,7 @@ manager = Manager() manager.merge(database_manager, namespace='db') manager.merge(bulkimport_manager, namespace='bulkimport') -manager.merge(igcexport_manager, namespace='igcexport') +manager.merge(export_manager, namespace='export') manager.merge(logbook_manager, namespace='logbook') manager.merge(stats_manager, namespace='stats') manager.merge(flights_manager, namespace='flights') diff --git a/ogn/commands/igcexport.py b/ogn/commands/export.py similarity index 54% rename from ogn/commands/igcexport.py rename to ogn/commands/export.py index bb377dc..daec62f 100644 --- a/ogn/commands/igcexport.py +++ b/ogn/commands/export.py @@ -1,5 +1,6 @@ import datetime import re +import csv from aerofiles.igc import Writer from manager import Manager @@ -10,10 +11,52 @@ from ogn.model import AircraftBeacon, Device manager = Manager() +@manager.command +def cup(): + """Export receiver waypoints as '.cup'.""" + + sql = """ + SELECT + 'OGN-' || sq.name AS name, + sq.name AS code, + c.iso2 AS country, + CASE WHEN sq.lat_deg < 10 THEN '0' ELSE '' END || CAST((sq.lat_deg*100 + sq.lat_min) AS decimal(18, 5)) || sq.lat_sig AS lat, + CASE WHEN sq.lon_deg < 10 THEN '00' WHEN sq.lon_deg < 100 THEN '0' ELSE '' END || CAST(sq.lon_deg*100 + sq.lon_min AS decimal(18, 5)) || sq.lon_sig AS lon, + altitude || 'm' AS elev, + '8' AS style, + '' AS rwdir, + '' AS rwlen, + '' AS freq, + 'lastseen: ' || sq.lastseen::date || ', version: ' || sq.version || ', platform: ' || sq.platform AS desc + FROM ( + SELECT + st_y(location) as lat, + CASE WHEN ST_Y(location) > 0 THEN 'N' ELSE 'S' END AS lat_sig, + FLOOR(ABS(ST_Y(location))) AS lat_deg, + 60*(ABS(ST_Y(location)) - FLOOR(ABS(ST_Y(location)))) AS lat_min, + st_x(location) AS lon, + CASE WHEN ST_X(location) > 0 THEN 'E' ELSE 'W' END AS lon_sig, + FLOOR(ABS(ST_X(location))) AS lon_deg, + 60*(ABS(ST_X(location)) - FLOOR(ABS(ST_X(location)))) AS lon_min + , * + FROM receivers + WHERE lastseen - firstseen > INTERVAL'3 MONTH' AND lastseen > '2018-01-01 00:00:00' AND name NOT LIKE 'FNB%' + ) sq + INNER JOIN countries c ON c.gid = sq.country_id + ORDER BY sq.name; + """ + results = session.execute(sql) + + with open('receivers.cup', 'w') as outfile: + outcsv = csv.writer(outfile) + outcsv.writerow(results.keys()) + outcsv.writerows(results.fetchall()) + + @manager.arg('address', help='address (flarm id)') @manager.arg('date', help='date (format: yyyy-mm-dd)') @manager.command -def write(address, date): +def igc(address, date): """Export igc file for
at .""" if not re.match('.{6}', address): print("Address {} not valid.".format(address))