tdtp_parada_v2/tpmcqr_service/api/utils.py

107 lines
4.1 KiB
Python
Raw Normal View History

2025-02-03 02:36:54 -03:00
2025-02-03 03:46:09 -03:00
from tpmcqr_service import redis_client
2025-02-03 04:06:57 -03:00
from tpmcqr_service.models.gtfs import QRDev, Shapes, Paraderos, Trips, Stops, find_shape_position
2025-02-03 02:36:54 -03:00
import time
2025-02-03 04:13:30 -03:00
import pickle
2025-02-03 04:19:01 -03:00
import math
2025-02-03 02:36:54 -03:00
def calcula_distancias_parada(redis_id, parada_id):
salida_parada = dict()
2025-02-03 03:46:09 -03:00
devdb = QRDev.query.filter(QRDev.id_dispositivo==parada_id).one_or_none()
2025-02-03 02:36:54 -03:00
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))
2025-02-03 04:39:04 -03:00
print("{}".format(rt_linea))
2025-02-03 02:36:54 -03:00
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 = []
2025-02-03 04:17:42 -03:00
for item in rt_linea['servicios']:
2025-02-03 04:32:09 -03:00
print("{} - {} : {} {}".format(parada_distance, item[0], type(parada_distance), type(item[0])))
2025-02-03 02:36:54 -03:00
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']
2025-02-03 03:16:05 -03:00
trip_info = dict(zip(data_keys, expedicion))
2025-02-03 02:36:54 -03:00
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: #
2025-02-03 04:19:01 -03:00
salida = math.ceil(estimator/60)
2025-02-03 02:36:54 -03:00
trip_info['trip_estimator'] = 'Hace {} minutos'.format(salida)
def obtiene_datos_parada(id_paradero):
2025-02-03 03:54:15 -03:00
parada = Paraderos.query.filter(Paraderos.id_paradero==id_paradero).one_or_none()
2025-02-03 02:36:54 -03:00
if parada is None:
return None
return parada
def obtiene_lineas_parada(id_paradero):
lineas = []
2025-02-03 04:10:35 -03:00
for linea in Trips.query.join(Stops).filter(Stops.id_paradero == id_paradero).distinct(Trips.id_linea).all():
2025-02-03 02:36:54 -03:00
lineas.append(linea.id_linea)
return lineas