kopia lustrzana https://github.com/glidernet/ogn-python
rodzic
e1da7dcfac
commit
b5f111c257
|
@ -0,0 +1,34 @@
|
|||
"""remove unnecessary pre postgis columns
|
||||
|
||||
Revision ID: 2004ce1566c
|
||||
Revises: 277aca1b810
|
||||
Create Date: 2016-04-28 18:24:14.912833
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '2004ce1566c'
|
||||
down_revision = '277aca1b810'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
import geoalchemy2 as ga
|
||||
|
||||
|
||||
def upgrade():
|
||||
# POSTGIS is fast enough, so lets forget radius, theta and phi
|
||||
op.drop_column('aircraft_beacon', 'radius')
|
||||
op.drop_column('aircraft_beacon', 'theta')
|
||||
op.drop_column('aircraft_beacon', 'phi')
|
||||
|
||||
# ... and flight_state is not used
|
||||
op.drop_column('aircraft_beacon', 'flight_state')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.add_column('aircraft_beacon', sa.Column('radius', sa.Float))
|
||||
op.add_column('aircraft_beacon', sa.Column('theta', sa.Float))
|
||||
op.add_column('aircraft_beacon', sa.Column('phi', sa.Float))
|
||||
op.add_column('aircraft_beacon', sa.Column('flight_state', sa.SmallInteger))
|
|
@ -11,19 +11,14 @@ CELERYBEAT_SCHEDULE = {
|
|||
'task': 'ogn.collect.database.import_ddb',
|
||||
'schedule': timedelta(minutes=15),
|
||||
},
|
||||
'update-receiver-distance': {
|
||||
'task': 'ogn.collect.heatmap.update_beacon_receiver_distance_all',
|
||||
'schedule': timedelta(minutes=5),
|
||||
'update-logbook': {
|
||||
'task': 'ogn.collect.logbook.compute_takeoff_and_landing',
|
||||
'schedule': timedelta(minutes=15),
|
||||
},
|
||||
'update-receiver-table': {
|
||||
'task': 'ogn.collect.receiver.update_receivers',
|
||||
'schedule': timedelta(minutes=15),
|
||||
},
|
||||
# Only supported with postgresql backend
|
||||
# 'update-logbook': {
|
||||
# 'task': 'ogn.collect.logbook.compute_takeoff_and_landing',
|
||||
# 'schedule': timedelta(minutes=15),
|
||||
# },
|
||||
# 'update-receiver-table': {
|
||||
# 'task': 'ogn.collect.receiver.update_receivers',
|
||||
# 'schedule': timedelta(minutes=5),
|
||||
# },
|
||||
}
|
||||
|
||||
CELERY_TIMEZONE = 'UTC'
|
||||
|
|
|
@ -26,7 +26,6 @@ def close_db(signal, sender):
|
|||
|
||||
app = Celery('ogn.collect',
|
||||
include=["ogn.collect.database",
|
||||
"ogn.collect.heatmap",
|
||||
"ogn.collect.logbook",
|
||||
"ogn.collect.receiver"
|
||||
])
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
from math import atan2, pi, sqrt
|
||||
|
||||
from sqlalchemy import and_, desc, distinct
|
||||
from sqlalchemy.sql import null
|
||||
|
||||
from celery import group
|
||||
from celery.utils.log import get_task_logger
|
||||
from ogn.collect.celery import app
|
||||
|
||||
from ogn.model import AircraftBeacon, ReceiverBeacon
|
||||
from ogn.utils import haversine_distance
|
||||
|
||||
logger = get_task_logger(__name__)
|
||||
|
||||
|
||||
@app.task
|
||||
def update_beacon_receiver_distance(name):
|
||||
"""
|
||||
Calculate the distance between the receiver and its received aircrafts
|
||||
and write this data into each aircraft_beacon.
|
||||
"""
|
||||
|
||||
last_receiver_beacon = app.session.query(ReceiverBeacon) \
|
||||
.filter(ReceiverBeacon.name == name) \
|
||||
.order_by(desc(ReceiverBeacon.timestamp)) \
|
||||
.first()
|
||||
|
||||
if (last_receiver_beacon is None):
|
||||
return
|
||||
|
||||
aircraft_beacons_query = app.session.query(AircraftBeacon) \
|
||||
.filter(and_(AircraftBeacon.timestamp > last_receiver_beacon.timestamp,
|
||||
AircraftBeacon.receiver_name == name,
|
||||
AircraftBeacon.radius == null()))
|
||||
|
||||
for aircraft_beacon in aircraft_beacons_query.all():
|
||||
location0 = (last_receiver_beacon.latitude, last_receiver_beacon.longitude)
|
||||
location1 = (aircraft_beacon.latitude, aircraft_beacon.longitude)
|
||||
alt0 = last_receiver_beacon.altitude
|
||||
alt1 = aircraft_beacon.altitude
|
||||
|
||||
(flat_distance, phi) = haversine_distance(location0, location1)
|
||||
theta = atan2(alt1 - alt0, flat_distance) * 180 / pi
|
||||
distance = sqrt(flat_distance**2 + (alt1 - alt0)**2)
|
||||
|
||||
aircraft_beacon.radius = distance
|
||||
aircraft_beacon.theta = theta
|
||||
aircraft_beacon.phi = phi
|
||||
|
||||
app.session.commit()
|
||||
logger.warning("Updated receiver {}.".format(name))
|
||||
|
||||
|
||||
@app.task
|
||||
def update_beacon_receiver_distance_all():
|
||||
group(update_beacon_receiver_distance(receiver_name)
|
||||
for receiver_name in app.session.query(distinct(ReceiverBeacon.name)).all()).apply_async()
|
|
@ -24,13 +24,6 @@ class AircraftBeacon(Beacon):
|
|||
|
||||
flightlevel = Column(Float)
|
||||
|
||||
# Calculated values
|
||||
radius = Column(Float)
|
||||
theta = Column(Float)
|
||||
phi = Column(Float)
|
||||
|
||||
flight_state = Column(SmallInteger)
|
||||
|
||||
def __repr__(self):
|
||||
return "<AircraftBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % (
|
||||
self.name,
|
||||
|
|
14
ogn/utils.py
14
ogn/utils.py
|
@ -101,17 +101,3 @@ def get_airports(cupfile):
|
|||
print('Failed to parse line: {} {}'.format(line, e))
|
||||
|
||||
return airports
|
||||
|
||||
|
||||
def haversine_distance(location0, location1):
|
||||
from math import asin, sqrt, sin, cos, atan2, radians, degrees
|
||||
|
||||
lat0 = radians(location0[0])
|
||||
lon0 = radians(location0[1])
|
||||
lat1 = radians(location1[0])
|
||||
lon1 = radians(location1[1])
|
||||
|
||||
distance = 6366000 * 2 * asin(sqrt((sin((lat0 - lat1) / 2))**2 + cos(lat0) * cos(lat1) * (sin((lon0 - lon1) / 2))**2))
|
||||
phi = degrees(atan2(sin(lon0 - lon1) * cos(lat1), cos(lat0) * sin(lat1) - sin(lat0) * cos(lat1) * cos(lon0 - lon1)))
|
||||
|
||||
return distance, phi
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import unittest
|
||||
import unittest.mock as mock
|
||||
|
||||
from ogn.utils import get_ddb, get_trackable, get_country_code, haversine_distance,\
|
||||
get_airports
|
||||
from ogn.utils import get_ddb, get_trackable, get_country_code, get_airports
|
||||
from ogn.model import AddressOrigin
|
||||
|
||||
|
||||
|
@ -58,28 +57,3 @@ class TestStringMethods(unittest.TestCase):
|
|||
instance.reverse.side_effect = GeocoderTimedOut('Too busy')
|
||||
country_code = get_country_code(0, 0)
|
||||
self.assertIsNone(country_code)
|
||||
|
||||
def test_haversine_distance(self):
|
||||
# delta: one latitude degree
|
||||
location0 = (0, 0)
|
||||
location1 = (-1, 0)
|
||||
|
||||
(distance, phi) = haversine_distance(location0, location1)
|
||||
self.assertAlmostEqual(distance, 60 * 1852, -2)
|
||||
self.assertEqual(phi, 180)
|
||||
|
||||
# delta: one longitude degree at the equator
|
||||
location0 = (0, 0)
|
||||
location1 = (0, -1)
|
||||
|
||||
(distance, phi) = haversine_distance(location0, location1)
|
||||
self.assertAlmostEqual(distance, 60 * 1852, -2)
|
||||
self.assertEqual(phi, 90)
|
||||
|
||||
# delta: 29000m
|
||||
location0 = (48.865, 9.2225)
|
||||
location1 = (48.74435, 9.578)
|
||||
|
||||
(distance, phi) = haversine_distance(location0, location1)
|
||||
self.assertAlmostEqual(distance, 29265.6035812215, -1)
|
||||
self.assertAlmostEqual(phi, -117.1275408121, 5)
|
||||
|
|
Ładowanie…
Reference in New Issue