Ejemplo n.º 1
0
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))
Ejemplo n.º 2
0
    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)