示例#1
0
def get_airports_from_icao_code(departure_airport_icao_code, destination_airport_icao_code):
    with open_database_session() as session:
        departure_airport = Airport.airport_from_icao_code(
            session, departure_airport_icao_code)
        destination_airport = Airport.airport_from_icao_code(
            session, destination_airport_icao_code)
        return departure_airport, destination_airport
示例#2
0
def search_intersections_convection_cells(airport_tracking_list=None,
                                          algorithm_name=None,
                                          **kwargs):
    global session

    manager = IntersectionManager()

    with open_database_session() as session:
        all_convection_cells = ConvectionCell.all_convection_cells(session)

        for departure_airport, destination_airport in (
                _gen_departure_destination_airports(airport_tracking_list)):
            # filter convection cells withing departure and destination airports
            convection_cells = [
                cell for cell in all_convection_cells
                if cell.is_convection_cells_between_airports(
                    departure_airport, destination_airport)
            ]
            # find intersections
            intersections = _check_multiple_intersections(
                departure_airport, destination_airport, convection_cells,
                algorithm_name, **kwargs)
            # workaround - set airports
            manager.set_default_airports(departure_airport,
                                         destination_airport)
            # record results
            for intersection in intersections:
                manager.set_intersection(intersection)

    return manager
def main():

    def transform_to_portuguese(airport_name):
        if airport_name.endswith('International Airport'):
            return 'Aeroporto Internacional {}'.format(
                    airport_name.strip(' International Airport'))
        if airport_name.endswith('Airport'):
            return 'Aeroporto {}'.format(
                    airport_name.strip(' Airport'))

    with open_database_session() as session:
        airports = session.query(Airport).all()
        airports_str = ', '.join(['{} ({})'.format(
                transform_to_portuguese(a.name), a.icao_code) for a in airports])
        print (airports_str)
        print (len(airports))
        print ('-' * 100)

        flight_plans = session.query(FlightPlan).all()
        counter = Counter()
        for flight_plan in flight_plans:
            company = flight_plan.callsign[:3]
            counter[company] += 1
        
        print (counter.most_common())
        print (len(flight_plans))
示例#4
0
def get_normalization_results(filepath, manager, min_entries_per_section):
    
    with open_database_session() as session:
        for departure_airport, destination_airport in manager:

            count_flight_positions = sum(1 
                for flight_plan in (FlightPlan.
                    flight_plans_from_airports(session, departure_airport, destination_airport))
                    for flight_location in session.query(FlightLocation).join(Flight)
                        .filter(Flight.flight_plan == flight_plan))
            
            # (# positions) - (# positions')
            sections = Section.sections_from_airports(
                    departure_airport, 
                    destination_airport, 
                    min_entries_per_section=min_entries_per_section)
            count_normalized_flight_positions = sum(
                len(section) for section in sections)

            # ratio: positions -> positions'
            ratio = round(count_normalized_flight_positions / count_flight_positions, 3)

            df = pd.DataFrame(
                data={
                    'Posições de voo': [count_flight_positions], 
                    'Posições de voo normalizadas': [count_normalized_flight_positions],
                    'Proporção': [ratio],
                }
            )

            df.to_csv(path_or_buf=os.path.join(filepath, 'normalization.csv'), index=False)
示例#5
0
def insert_airports_in_database(airports_dataframe):
    with open_database_session() as session:
        for _, airport_data in airports_dataframe.iterrows():
            if check_valid_airport(airport_data):
                airport = get_airport_from_airport_data(airport_data)
                session.add(airport)
        session.commit()
示例#6
0
def insert_flight_plans_in_database(flight_plans):
    with open_database_session() as session:
        for i, flight_plan in enumerate(flight_plans):
            q = session.query(FlightPlan).filter(
                FlightPlan.callsign == flight_plan.callsign)
            if (not session.query(literal(True))
                    .filter(q.exists()).scalar()):
                session.add(flight_plan)
                session.commit()
示例#7
0
def plot_most_descriptive_flight_paths(filepath, departure_airport, destination_airport):    
    with open_database_session() as session:
    
        top_flights = sorted([
            flight 
            for flight_plan in (FlightPlan.
                flight_plans_from_airports(session, departure_airport, destination_airport))
                for flight in session.query(Flight).filter(Flight.flight_plan == flight_plan)], 
            key=lambda flight: len(flight.flight_locations),
            reverse=True,
        )[:10]

        for flight in top_flights:
            filename = build_filename_from_flight(flight)
            plot_from_flight_locations(
                filepath=os.path.join(filepath, filename + '.1.pdf'), 
                flight_locations=flight.flight_locations,
                departure_airport=departure_airport,
                destination_airport=destination_airport,
            )
            normalized_flight_locations = normalize_from_flight_locations(flight.flight_locations)
            plot_from_flight_locations(
                filepath=os.path.join(filepath, filename + '.2.norm.pdf'),
                flight_locations=normalized_flight_locations,
                departure_airport=departure_airport,
                destination_airport=destination_airport,
            )
            plot_from_multiple_flight_locations(
                filepath=os.path.join(filepath, filename + '.3.mult.pdf'),
                multiple_flight_locations=[
                    flight.flight_locations, 
                    normalized_flight_locations],
                departure_airport=departure_airport,
                destination_airport=destination_airport,
            )
            
            # plot flight path params
            plot_flight_locations_params(
                filepath=os.path.join(filepath, filename + '.4.params.pdf'), 
                flight_locations=flight.flight_locations,
            )
            normalized_flight_locations = normalize_from_flight_locations(flight.flight_locations)
            plot_flight_locations_params(
                filepath=os.path.join(filepath, filename + '.5.params.norm.pdf'),
                flight_locations=normalized_flight_locations,
            )
            plot_multiple_flight_locations_params(
                filepath=os.path.join(filepath, filename + '.6.params.mult.pdf'),
                multiple_flight_locations=[
                    flight.flight_locations, 
                    normalized_flight_locations],
            )
示例#8
0
def track_en_route_flights():
    '''Keep track of ALL en-route flights'''
    global session 

    address_to_flight = {}
    count_iterations = 0
    
    with open_database_session() as session:
        while count_iterations < ITERATIONS_LIMIT_TO_SEARCH_FLIGHTS:
            time.sleep(SLEEP_TIME_TO_GET_FLIGHT_IN_SECS)
            if _should_update_flight_addresses(count_iterations):
                addresses = _get_addresses_within_brazilian_airspace()
            _update_flights(address_to_flight, addresses)
            count_iterations += 1
示例#9
0
def track_convection_cells():
    '''Keep track of ALL convection cells'''
    global session

    client = STSC()
    count_iterations = 0
    prev_cells = set()

    with open_database_session() as session:
        while count_iterations < ITERATIONS_LIMIT_TO_SEARCH_CONVECTION_CELLS:
            time.sleep(SLEEP_TIME_TO_GET_CONVECTION_CELLS_IN_SECS)
            if client.has_changed:
                curr_cells = client.cells
                save_convection_cells(new_cells=curr_cells - prev_cells)
                prev_cells = curr_cells
            count_iterations += 1
示例#10
0
    def sections_from_airports(departure_airport, destination_airport,
                               **kwargs):
        '''Return sections from flight locations'''
        min_entries_per_section = kwargs.get('min_entries_per_section',
                                             NUMBER_ENTRIES_PER_SECTION)

        key = (
            departure_airport.icao_code,
            destination_airport.icao_code,
            min_entries_per_section,
        )

        if key not in Section.cache:
            with open_database_session() as session:
                flight_locations = normalizer.normalize_from_airports(
                    session, departure_airport, destination_airport)

            # section should be longitude based
            longitude_based = Airport.should_be_longitude_based(
                departure_airport, destination_airport)

            sections = []
            if not flight_locations:
                return sections

            prev_flight_location = flight_locations[0]
            section_flight_locations = [prev_flight_location]

            for curr_flight_location in flight_locations[1:]:
                if Section._flight_locations_are_part_of_the_same_section(
                        prev_flight_location, curr_flight_location,
                        longitude_based):
                    section_flight_locations.append(curr_flight_location)
                else:
                    if len(section_flight_locations
                           ) >= min_entries_per_section:
                        section = Section.from_flight_locations(
                            section_flight_locations)
                        sections.append(section)
                    section_flight_locations = [curr_flight_location]
                prev_flight_location = curr_flight_location

            Section.cache[key] = sections

        # return cached results
        return Section.cache[key]
示例#11
0
def get_intersection_results(filepath, manager):

    for (departure_airport, destination_airport), intersections in manager.items():

        # convection cells within departure and destination airports
        with open_database_session() as session:
            cells = [cell for cell in ConvectionCell.all_convection_cells(session) 
                if cell.is_convection_cells_between_airports(departure_airport, destination_airport)]

        intersected_cells = [cell for cell, _, _, impact in intersections]

        ratio = None
        if cells:
            ratio = len(intersected_cells) / len(cells)

        df = pd.DataFrame(
            data={
                'Células convectivas': [len(cells)], 
                'Células convectivas intersectadas': [len(intersected_cells)], 
                'Proporção': [ratio], 
            }
        )
        df.to_csv(path_or_buf=os.path.join(filepath, 'cells.csv'), index=False)

        impacts = [impact for cell, _, _, impact in intersections]
        latitudes = [lat for lat, _, _ in intersected_cells]
        longitudes = [lon for _, lon, _ in intersected_cells]
        radiuses = [rad for _, _, rad in intersected_cells]
        timestamps = [cell.timestamp.strftime(r'%d-%m-%Y %H:%M') for cell in intersected_cells]

        df = pd.DataFrame(
            data={
                'Impacto': impacts, 
                'Latitude': latitudes, 
                'Longitude': longitudes, 
                'Raio': radiuses, 
                'Timestamp': timestamps, 
            }
        )
        df.index += 1 # index starts from 1

        (df.sort_values(by=['Impacto'], ascending=False)
            .to_csv(path_or_buf=os.path.join(filepath, 'intersection.csv')))
示例#12
0
def convection_cells_stats(convection_cell_ids):
    global session

    with open_database_session() as session:
        BSB = Airport.airport_from_icao_code(session, 'SBBR')
        GRU = Airport.airport_from_icao_code(session, 'SBGR')

        print('create intersections table from', BSB, 'to', GRU)
        # create_intersections_table(session, convection_cell_ids, BSB, GRU)
        print('#' * 20)
        print()

        print('create intersections table from', GRU, 'to', BSB)
        create_intersections_table(session, convection_cell_ids, GRU, BSB)
        print('#' * 20)
        print()

        print('generate flights vs convection cells charts')
        plot_flights_vs_convection_cells(session, convection_cell_ids)
示例#13
0
def track_en_route_flights_by_airports(
    departure_airport_code, destination_airport_code, round_trip_mode=False):
    '''Keep track of current flights information from departure airport to destination airport.'''
    global session 

    logger.info('Track flight addresses from {0} to {1} in {2} mode'.format(
        departure_airport_code, destination_airport_code, 'round trip' if round_trip_mode else 'one way'))
    
    address_to_flight = {}
    count_iterations = 0
    
    with open_database_session() as session:
        departure_airport = Airport.airport_from_icao_code(session, departure_airport_code)
        destination_airport = Airport.airport_from_icao_code(session, destination_airport_code)
        
        while count_iterations < ITERATIONS_LIMIT_TO_SEARCH_FLIGHTS:
            time.sleep(SLEEP_TIME_TO_GET_FLIGHT_IN_SECS)
            if _should_update_flight_addresses(count_iterations):
                addresses = _update_flight_addresses(
                    departure_airport, destination_airport, round_trip_mode)
            _update_flights(address_to_flight, addresses)
            count_iterations += 1
示例#14
0
def get_convection_cells(departure_airport, destination_airport):
    # convection cells within departure and destination airports
    with open_database_session() as session:
        return {cell for cell in ConvectionCell.all_convection_cells(session) 
            if cell.is_convection_cells_between_airports(departure_airport, destination_airport)}
示例#15
0
def has_flight_plan_data_valid_callsign(flight_plan_data):
    callsign = flight_plan_data['callsign']
    with open_database_session() as session:
        airlines = session.query(Airline).all()
        return any(callsign.startswith(airline.icao_code) for airline in airlines)   
示例#16
0
def get_airport_from_icao_code(icao_code):
    with open_database_session() as session:
        return session.query(Airport).filter(Airport.icao_code == icao_code).first()
示例#17
0
def get_all_airports():
    with open_database_session() as session:
        return session.query(Airport).all()
示例#18
0
def has_flight_plan_data_valid_destination_airport(flight_plan_data):
    icao_code = flight_plan_data['destination_airport']
    with open_database_session() as session:
        q = session.query(Airport).filter(Airport.icao_code == icao_code)
        return session.query(literal(True)).filter(q.exists()).scalar()