Add reduced MGRS location to aircraft_beacons: ALTER TABLE aircraft_beacons ADD COLUMN location_mgrs_short character varying(9);

pull/68/head
Konstantin Gründger 2019-01-23 13:06:50 +01:00
rodzic 022e8a8099
commit 02e8c17dca
5 zmienionych plików z 24 dodań i 15 usunięć

Wyświetl plik

@ -27,20 +27,20 @@ def create_receiver_coverage(session=None, date=None):
else:
(start, end) = date_to_timestamps(date)
# Filter aircraft beacons and shrink precision of MGRS from 1m to 1km resolution: 30UXC 00061 18429 -> 30UXC 00 18
sq = session.query((func.left(AircraftBeacon.location_mgrs, 5, type_=String) + func.substring(AircraftBeacon.location_mgrs, 6, 2, type_=String) + func.substring(AircraftBeacon.location_mgrs, 11, 2, type_=String)).label('reduced_mgrs'),
# Filter aircraft beacons
sq = session.query(AircraftBeacon.location_mgrs_short.label('location_mgrs'),
AircraftBeacon.receiver_id,
AircraftBeacon.signal_quality,
AircraftBeacon.altitude,
AircraftBeacon.device_id) \
.filter(and_(between(AircraftBeacon.timestamp, start, end),
AircraftBeacon.location_mgrs != null(),
AircraftBeacon.location_mgrs_short != null(),
AircraftBeacon.receiver_id != null(),
AircraftBeacon.device_id != null())) \
.subquery()
# ... and group them by reduced MGRS, receiver and date
query = session.query(sq.c.reduced_mgrs,
query = session.query(sq.c.location_mgrs,
sq.c.receiver_id,
func.cast(date, Date).label('date'),
func.max(sq.c.signal_quality).label('max_signal_quality'),
@ -54,7 +54,7 @@ def create_receiver_coverage(session=None, date=None):
# if a receiver coverage entry exist --> update it
upd = update(ReceiverCoverage) \
.where(and_(ReceiverCoverage.location_mgrs == query.c.reduced_mgrs,
.where(and_(ReceiverCoverage.location_mgrs == query.c.location_mgrs,
ReceiverCoverage.receiver_id == query.c.receiver_id,
ReceiverCoverage.date == date)) \
.values({"max_signal_quality": query.c.max_signal_quality,

Wyświetl plik

@ -92,6 +92,7 @@ class LogfileDbSaver():
radial smallint,
quality real,
location_mgrs character varying(15),
location_mgrs_short character varying(9),
receiver_id int,
device_id int);
@ -246,6 +247,7 @@ class LogfileDbSaver():
ab.frequency_offset, ab.gps_quality_horizontal, ab.gps_quality_vertical, ab.software_version, ab.hardware_version, ab.real_address, ab.signal_power,
ab.location_mgrs,
ab.location_mgrs_short,
d.id AS device_id,
r.id AS receiver_id,
@ -302,6 +304,7 @@ class LogfileDbSaver():
CAST(MAX(quality) AS REAL) AS quality,
CAST(MAX(agl) AS REAL) AS agl,
MAX(location_mgrs) AS location_mgrs,
MAX(location_mgrs_short) AS location_mgrs_short,
MAX(receiver_id) AS receiver_id,
MAX(device_id) AS device_id
@ -362,7 +365,7 @@ class LogfileDbSaver():
query = """
INSERT INTO aircraft_beacons(location, altitude, name, dstcall, relay, receiver_name, timestamp, track, ground_speed,
address_type, aircraft_type, stealth, address, climb_rate, turn_rate, signal_quality, error_count, frequency_offset, gps_quality_horizontal, gps_quality_vertical, software_version, hardware_version, real_address, signal_power,
distance, radial, quality, agl, location_mgrs,
distance, radial, quality, agl, location_mgrs, location_mgrs_short,
receiver_id, device_id)
{}
ON CONFLICT DO NOTHING;
@ -515,7 +518,7 @@ def convert(sourcefile, datestr, saver):
if message['beacon_type'] in AIRCRAFT_TYPES:
message = dictfilt(message, ('beacon_type', 'aprs_type', 'location_wkt', 'altitude', 'name', 'dstcall', 'relay', 'receiver_name', 'timestamp', 'track', 'ground_speed',
'address_type', 'aircraft_type', 'stealth', 'address', 'climb_rate', 'turn_rate', 'signal_quality', 'error_count', 'frequency_offset', 'gps_quality_horizontal', 'gps_quality_vertical', 'software_version', 'hardware_version', 'real_address', 'signal_power',
'distance', 'radial', 'quality', 'agl', 'location_mgrs',
'distance', 'radial', 'quality', 'agl', 'location_mgrs', 'location_mgrs_short',
'receiver_id', 'device_id'))
beacon = AircraftBeacon(**message)

Wyświetl plik

@ -18,7 +18,9 @@ def _replace_lonlat_with_wkt(message):
location = Location(longitude, latitude)
message['location_wkt'] = location.to_wkt()
message['location_mgrs'] = myMGRS.toMGRS(latitude, longitude).decode('utf-8')
location_mgrs = myMGRS.toMGRS(latitude, longitude).decode('utf-8')
message['location_mgrs'] = location_mgrs
message['location_mgrs_short'] = location_mgrs[0:5] + location_mgrs[5:7] + location_mgrs[10:12]
del message['latitude']
del message['longitude']
return message

Wyświetl plik

@ -29,7 +29,8 @@ class AircraftBeacon(Beacon):
distance = Column(Float(precision=2))
radial = Column(SmallInteger)
quality = Column(Float(precision=2)) # signal quality normalized to 10km
location_mgrs = Column(String(15))
location_mgrs = Column(String(15)) # full mgrs (15 chars)
location_mgrs_short = Column(String(9)) # reduced mgrs (9 chars), e.g. used for melissas range tool
agl = Column(Float(precision=2))
# Relations
@ -44,7 +45,7 @@ class AircraftBeacon(Beacon):
Index('ix_aircraft_beacons_device_id_timestamp', 'device_id', 'timestamp')
def __repr__(self):
return "<AircraftBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % (
return "<AircraftBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % (
self.address_type,
self.aircraft_type,
self.stealth,
@ -64,7 +65,8 @@ class AircraftBeacon(Beacon):
self.distance,
self.radial,
self.quality,
self.location_mgrs)
self.location_mgrs,
self.location_mgrs_short)
@classmethod
def get_columns(self):
@ -100,7 +102,8 @@ class AircraftBeacon(Beacon):
'distance',
'radial',
'quality',
'location_mgrs']
'location_mgrs',
'location_mgrs_short']
def get_values(self):
return [
@ -136,7 +139,8 @@ class AircraftBeacon(Beacon):
self.distance,
self.radial,
self.quality,
self.location_mgrs]
self.location_mgrs,
self.location_mgrs_short]
Index('ix_aircraft_beacons_date_device_id_address', func.date(AircraftBeacon.timestamp), AircraftBeacon.device_id, AircraftBeacon.address)

Wyświetl plik

@ -35,8 +35,8 @@ class TestDB(unittest.TestCase):
session.commit()
# Create beacons and insert
self.ab01 = AircraftBeacon(name='FLRDD0815', receiver_name='Koenigsdf', device_id=self.dd0815.id, receiver_id=self.r01.id, timestamp='2017-12-10 10:00:00', location_mgrs='89ABC1234567890', altitude=800)
self.ab02 = AircraftBeacon(name='FLRDD0815', receiver_name='Koenigsdf', device_id=self.dd0815.id, receiver_id=self.r01.id, timestamp='2017-12-10 10:00:01', location_mgrs='89ABC1299967999', altitude=850)
self.ab01 = AircraftBeacon(name='FLRDD0815', receiver_name='Koenigsdf', device_id=self.dd0815.id, receiver_id=self.r01.id, timestamp='2017-12-10 10:00:00', location_mgrs_short='89ABC1267', altitude=800)
self.ab02 = AircraftBeacon(name='FLRDD0815', receiver_name='Koenigsdf', device_id=self.dd0815.id, receiver_id=self.r01.id, timestamp='2017-12-10 10:00:01', location_mgrs_short='89ABC1267', altitude=850)
session.add(self.ab01)
session.add(self.ab02)
session.commit()