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