Added receiver waypoints as cup

pull/68/head
Konstantin Gründger 2019-01-31 21:26:20 +01:00
rodzic 6522bce14d
commit 55bbcd8efc
3 zmienionych plików z 49 dodań i 5 usunięć

Wyświetl plik

@ -147,8 +147,9 @@ available commands:
[gateway]
run Run the aprs client.
[igcexport]
write Export igc file for <address> at <date>.
[export]
cup Export receiver waypoints as '.cup'.
igc Export igc file for <address> at <date>.
[logbook]
compute_logbook Compute logbook.

Wyświetl plik

@ -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')

Wyświetl plik

@ -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 <address> at <date>."""
if not re.match('.{6}', address):
print("Address {} not valid.".format(address))