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