From c815b8a251656d2ec4173f7bff17eb451dcd7ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gru=CC=88ndger?= Date: Thu, 3 Jan 2019 20:06:47 +0100 Subject: [PATCH] Added flight path calculation --- ogn/commands/flights.py | 78 +++++++++++++++++++++++++++++++ tests/commands/test_bulkimport.py | 53 --------------------- 2 files changed, 78 insertions(+), 53 deletions(-) create mode 100644 ogn/commands/flights.py delete mode 100644 tests/commands/test_bulkimport.py diff --git a/ogn/commands/flights.py b/ogn/commands/flights.py new file mode 100644 index 0000000..0d2e56f --- /dev/null +++ b/ogn/commands/flights.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime + +from manager import Manager +from ogn.commands.dbutils import session +from ogn.commands.database import get_database_days +from tqdm import tqdm + +manager = Manager() + + +def compute_flights2d(session, date): + query = """ + INSERT INTO flights2d + ( + date, + device_id, + path, + path_simple + ) + SELECT sq5.date, + sq5.device_id, + st_collect(sq5.linestring order BY sq5.part) multilinestring, + st_collect(st_simplify(sq5.linestring ORDER BY sq5.part) simple_multilinestring + FROM ( + SELECT sq4.timestamp::date AS date, + sq4.device_id, + sq4.part, + st_makeline(sq4.location ORDER BY sq4.timestamp) linestring + FROM ( + SELECT sq3.timestamp, + sq3.location, + sq3.device_id, + sum(sq3.ping) OVER (partition BY sq3.timestamp::date, sq3.device_id ORDER BY sq3.timestamp) part + FROM ( + SELECT sq2.t1 AS timestamp, + sq2.l1 AS location, + sq2.d1 device_id, + CASE + WHEN sq2.t1 - sq2.t2 < interval'100s' AND ST_DistanceSphere(sq2.l1, sq2.l2) < 1000 THEN 0 + ELSE 1 + END AS ping + FROM ( + SELECT sq.timestamp t1, + lag(sq.timestamp) OVER (partition BY sq.device_id ORDER BY sq.timestamp) t2, + sq.location l1, + lag(sq.location) OVER (partition BY sq.device_id ORDER BY sq.timestamp) l2, + sq.device_id d1, + lag(sq.device_id) OVER (partition BY sq.device_id ORDER BY sq.timestamp) d2 + FROM ( + SELECT DISTINCT ON (device_id, timestamp) timestamp, device_id, location + FROM aircraft_beacons + WHERE timestamp BETWEEN '{0} 00:00:00' AND '{0} 23:59:59' + ORDER BY device_id, timestamp, error_count + ) sq + ) sq2 + ) sq3 + ) sq4 + GROUP BY sq4.timestamp::date, sq4.device_id, sq4.part + ) sq5 + GROUP BY sq5.date, sq5.device_id + ON CONFLICT DO NOTHING; + """.format(date.strftime('%Y-%m-%d')) + session.execute(query) + session.commit() + + +@manager.command +def flights2d(start=None, end=None): + """Compute flights.""" + + days = get_database_days(start, end) + + pbar = tqdm(days) + for single_date in pbar: + pbar.set_description(datetime.strftime(single_date, '%Y-%m-%d')) + result = compute_flights2d(session=session, date=single_date) diff --git a/tests/commands/test_bulkimport.py b/tests/commands/test_bulkimport.py deleted file mode 100644 index 1c818d6..0000000 --- a/tests/commands/test_bulkimport.py +++ /dev/null @@ -1,53 +0,0 @@ -import unittest -import os - -from ogn.commands.bulkimport import convert_logfile, import_csv_logfile -from ogn.model import AircraftBeacon, ReceiverBeacon - - -class TestDB(unittest.TestCase): - session = None - engine = None - app = None - - def setUp(self): - os.environ['OGN_CONFIG_MODULE'] = 'config.test' - from ogn.commands.dbutils import engine, session - self.session = session - self.engine = engine - - from ogn.commands.database import init - init() - - def tearDown(self): - session = self.session - session.execute("DELETE FROM aircraft_beacons") - session.execute("DELETE FROM receiver_beacons") - session.commit() - - def test_convert_logfile(self): - path = os.path.dirname(__file__) - - convert_logfile(path=path) - - os.remove(os.path.join(path, 'aircraft_beacons.csv_2016-09-21.gz')) - os.remove(os.path.join(path, 'receiver_beacons.csv_2016-09-21.gz')) - - def test_import_csv_logfile(self): - session = self.session - - path = os.path.dirname(__file__) - - convert_logfile(path=path) - - import_csv_logfile(path, 'aircraft_beacons.csv_2016-09-21.gz') - import_csv_logfile(path, 'receiver_beacons.csv_2016-09-21.gz') - - os.remove(os.path.join(path, 'aircraft_beacons.csv_2016-09-21.gz')) - os.remove(os.path.join(path, 'receiver_beacons.csv_2016-09-21.gz')) - - aircraft_beacons = session.query(AircraftBeacon).all() - receiver_beacons = session.query(ReceiverBeacon).all() - - self.assertGreater(len(aircraft_beacons), 1) - self.assertGreater(len(receiver_beacons), 1)