Example #1
0
def get_left_turn_guideways(all_lanes, nodes_dict):
    """
    Compile a list of guideways for all legal left turns
    :param all_lanes: list of dictionaries
    :param nodes_dict: dictionary
    :return: list of dictionaries
    """
    logger.info('Starting left turn guideways')
    guideways = []
    for origin_lane in all_lanes:
        if is_left_turn_allowed(origin_lane):
            logger.debug('Origin Lane ' + dictionary_to_log(origin_lane))
            for destination_lane in get_destination_lanes_for_left_turn(
                    origin_lane, all_lanes, nodes_dict):
                logger.debug('Destin Lane ' +
                             dictionary_to_log(destination_lane))
                try:
                    guideway_data = get_direct_turn_guideway(origin_lane,
                                                             destination_lane,
                                                             all_lanes,
                                                             turn_type='left')
                    set_guideway_id(guideway_data)
                except Exception as e:
                    logger.exception(e)
                    guideway_data = None

                if guideway_data is not None:
                    logger.debug('Guideway ' +
                                 dictionary_to_log(guideway_data))
                    guideways.append(guideway_data)

    logger.info('Created %d guideways' % len(guideways))
    return guideways
def get_bicycle_left_turn_guideways(all_lanes, nodes_dict):
    """
    Compile a list of bicycle guideways for all legal left turns
    :param all_lanes: list of dictionaries
    :param nodes_dict: dictionary
    :return: list of dictionaries
    """
    logger.info('Starting bicycle left turn guideways')
    guideways = []
    through_guideways = get_through_guideways(all_lanes)

    for origin_lane in all_lanes:
        if is_left_turn_allowed(origin_lane):
            for destination_lane in get_destination_lanes_for_left_turn(
                    origin_lane, all_lanes, nodes_dict):
                origin_candidates = [
                    g for g in through_guideways
                    if g['origin_lane']['id'] == origin_lane['id']
                ]
                destination_candidates = [
                    g for g in through_guideways
                    if g['destination_lane']['id'] == destination_lane['id']
                ]
                if origin_candidates and destination_candidates:
                    logger.debug('Origin Lane ' +
                                 dictionary_to_log(origin_candidates[0]))
                    logger.debug('Destin Lane ' +
                                 dictionary_to_log(destination_candidates[0]))
                    try:
                        guideway_data = get_bicycle_left_guideway(
                            origin_lane, destination_lane,
                            origin_candidates[0], destination_candidates[0])
                        set_guideway_id(guideway_data)
                    except Exception as e:
                        logger.exception(e)
                        guideway_data = None

                else:
                    guideway_data = None

                if guideway_data is not None \
                        and guideway_data['left_border'] is not None \
                        and guideway_data['median'] is not None \
                        and guideway_data['right_border'] is not None:
                    logger.debug('Guideway ' +
                                 dictionary_to_log(guideway_data))
                    guideways.append(guideway_data)

    logger.info('Created %d guideways' % len(guideways))
    return guideways
Example #3
0
def get_direct_turn_guideway(origin_lane,
                             destination_lane,
                             all_lanes,
                             turn_type='right'):
    """
    Create a right or left turn guideway if there is no link lane connecting origin and destination
    :param origin_lane: dictionary
    :param destination_lane: dictionary
    :param all_lanes: list of dictionaries
    :param turn_type: string: 'right' for a right turn, left' a for left one
    :return: dictionary
    """

    logger.debug('Starting direct turn guideway')
    if turn_type == 'right':
        if not is_right_turn_allowed(origin_lane, all_lanes):
            logger.debug('Right turn not allowed. Origin id %d' %
                         origin_lane['id'])
            return None
        turn_direction = 1
    else:
        if not is_left_turn_allowed(origin_lane):
            logger.debug('Left turn not allowed. Origin id %d' %
                         origin_lane['id'])
            return None
        turn_direction = -1

    guideway = {
        'direction': turn_type,
        'origin_lane': origin_lane,
        'destination_lane': destination_lane,
    }

    left_border = get_turn_border(origin_lane,
                                  destination_lane,
                                  all_lanes,
                                  border_type='left',
                                  turn_direction=turn_direction)
    if left_border is None:
        logger.debug('Left border failed. Origin id %d, Dest id %d' %
                     (origin_lane['id'], destination_lane['id']))
        return None

    right_border = get_turn_border(origin_lane,
                                   destination_lane,
                                   all_lanes,
                                   border_type='right',
                                   turn_direction=turn_direction)
    if right_border is None:
        logger.debug('Right border failed. Origin id %d, Dest id %d' %
                     (origin_lane['id'], destination_lane['id']))
        return None

    median = get_turn_border(origin_lane,
                             destination_lane,
                             all_lanes,
                             border_type='median',
                             turn_direction=turn_direction)
    if median is None:
        logger.debug('Median failed. Origin id %d, Dest id %d' %
                     (origin_lane['id'], destination_lane['id']))
        return None

    guideway['left_border'] = left_border
    guideway['median'] = median
    guideway['right_border'] = right_border
    return guideway