from tpmcqr_service import redis_client, db from tpmcqr_service.models.gtfs import QRDev, Shapes, find_shape_position import time def calcula_distancias_parada(redis_id, parada_id): salida_parada = dict() devdb = db.query(QRDev).filter(QRDev.id_dispositivo==parada_id).one_or_none() if not devdb: salida_parada['debug'] = 'Invalid Request' return 400, salida_parada paradadb = obtiene_datos_parada(devdb.id_paradero) if not paradadb: salida_parada['debug'] = 'Parada {}'.format(devdb.id_paradero) return 200, salida_parada for key in ['stop_name', 'stop_lat', 'stop_lon']: salida_parada[key] = getattr(paradadb, key) salida_parada['lineas'] = [] for id_linea in obtiene_lineas_parada(devdb.id_paradero): rt_linea = pickle.loads(redis_client.get(id_linea)) info_linea = dict() for key in ['route_short_name', 'route_long_name', 'route_color', 'route_text_color', 'lur']: info_linea[key] = rt_linea[key] info_linea['servicios'] = [] info_linea['recientes'] = [] if 'id_shape' in rt_linea: parada_pos, parada_distance = find_shape_position(rt_linea['id_shape'], salida_parada['stop_lat'], salida_parada['stop_lon']) expediciones_enruta = [] expediciones_pasadas = [] for item in rt_linea['servicios'].items(): if item[0] < parada_distance: expediciones_enruta.append(item) else: expediciones_pasadas.append(item) if len(expediciones_enruta) > 0: info_linea['servicios'].append( estima_llegada(parada_distance, expediciones_enruta.pop(-1)) ) if len(expediciones_enruta) > 0: info_linea['servicios'].append( estima_llegada(parada_distance, expediciones_enruta.pop(-1)) ) if len(expediciones_pasadas) > 0: info_linea['recientes'].append( estima_llegada(parada_distance, expediciones_pasadas.pop(0)) ) if len(expediciones_pasadas) > 0: info_linea['recientes'].append( estima_llegada(parada_distance, expediciones_pasadas.pop(0)) ) salida_parada['lineas'].append(info_linea) return 200, salida_parada def estima_llegada(parada_distance, expedicion): ts = int(time.time()) data_keys = ['trip_traveled', 'ppu', 'trip_lat', 'trip_lng', 'trip_pos', 'ts'] trip_info = dict(zip(data_keys, expedicion)) trip_info['drift'] = int(trip_info['ts']) - ts trip_info['trip_distance'] = parada_distance - int(trip_info['trip_traveled']) estimator = int(trip_info['trip_distance'] / 5) # 18 Km/h promedio -> 5 m/s trip_info['debug_estimator'] = estimator if estimator > 1570: # 26:10 minutos trip_info['trip_estimator'] = '25-30 minutos' elif estimator > 1260: # #21 minutos trip_info['trip_estimator'] = '20-25 minutos' elif estimator > 950: #15:50 minutos trip_info['trip_estimator'] = '15-20 minutos' elif estimator > 640: #10:40 minutos trip_info['trip_estimator'] = '10-15 minutos' elif estimator > 330: # 5:30 trip_info['trip_estimator'] = '5-10 minutos' elif estimator > 200: # 3:20 sec trip_info['trip_estimator'] = '3 minutos' elif estimator > 70: # trip_info['trip_estimator'] = 'Llegando' elif estimator > 0: # trip_info['trip_estimator'] = 'En parada' else: # salida = ceil(estimator/60) trip_info['trip_estimator'] = 'Hace {} minutos'.format(salida) def obtiene_datos_parada(id_paradero): parada = db.query(Paradero).filter(Paradero.id_paradero==id_paradero).one_or_none() if parada is None: return None return parada def obtiene_lineas_parada(id_paradero): lineas = [] for linea in db.query(Trip).filter(Trip.id_paradero == id_paradero).distict(Trip.id_linea).all(): lineas.append(linea.id_linea) return lineas