import os import io import csv import traceback from datetime import datetime def parse_time(strinput): try: h, m, s = strinput.split(":") h = int(h) d = 0 while h > 23: d += 1 h -= 24 return datetime.strptime("{}:{}:{}".format(h,m,s), '%H:%M:%S').time(), d except: current_app.logger.debug('Traceback {}'.format(traceback.format_exc())) current_app.logger.warning("Hora incorrecta => {}".format(strinput)) return datetime.strptime("01:01:01", '%H:%M:%S').time(), 0 def parse_paraderoid(strinput): primerodenero2022 = 44562 if strinput.find("-") > 0: current_app.logger.error("Error en el dato de la parada: {}".format(strinput)) try: whatdate= datetime.strptime('{}-{}'.format(strinput, 2022), '%d-%b-%Y').date() idparadero = primerodenero2022 + whatdate.timetuple().tm_yday current_app.logger.warning("Calculado el Identificador en base al año 2022 => {}".format(idparadero)) return idparadero except: return 0 else: return int(strinput) def completa_dataset(): iparaderos = 0 for paradero in Paradero.query.all(): iparaderos += 1 cparadero = 0 lparadas = 0 sparadas = 0 dparadas = 0 lineas = [] lparada = [] for parada in Parada.query.filter(Parada.paraderoid==paradero.id).all(): cparadero += 1 if cparadero % 1000 == 0: current_app.logger.debug("Paradero {}, {} detenciones. {} lineas".format(iparaderos, cparadero, len(lineas))) elemento = (parada.servicio.lineaid, parada.servicio.direccionid) if parada.servicio.dotw == 'S': sparadas += 1 elif parada.servicio.dotw == 'D': dparadas += 1 else: lparadas += 1 if elemento in lineas: continue lineas.append(elemento) if parada.servicio.direccionid: lparada.append("{} ({} ida)".format(parada.servicio.linea.codigo, parada.secuencia)) else: lparada.append("{} ({} regreso)".format(parada.servicio.linea.codigo, parada.secuencia)) lparada.sort() paradero.recorridos = " - ".join(lparada) paradero.paradas = 5*lparadas+sparadas+dparadas paradero.resumen = "{} paradas a la semana, {} lineas".format(paradero.paradas, len(lineas)) paradero.paradasl = lparadas paradero.paradass = sparadas paradero.paradasd = dparadas paradero.lineas = len(lineas) current_app.logger.info("Paradero {}, {} detenciones a la semana en {} lineas".format(iparaderos, paradero.paradas, len(lineas))) if iparaderos % 10 == 0: db.session.commit() db.session.commit() def agrega_paraderos(): from bs4 import BeautifulSoup from zipfile import ZipFile # print(os.getcwd()) current_app.logger.info("Archivo de paraderos, kmz") with ZipFile('webinterface/models/datos/PARADEROS_FORMALES.kmz', 'r') as kmz: kml = kmz.open(kmz.filelist[0].filename, 'r').read() soup = BeautifulSoup(kml, 'xml') existen = 0 nuevo = 0 for paradero in soup.find_all("kml:Placemark"): if (existen+nuevo) % 1000 == 0: current_app.logger.debug("Leidos {} paraderos existentes y {} nuevos".format(existen, nuevo)) lat = int(paradero.find("kml:SimpleData", {"name": "LATITUDE"}).text)/1000000 lng = int(paradero.find("kml:SimpleData", {"name": "LONGITUDE"}).text)/1000000 codigo = paradero.find("kml:SimpleData", {"name": "CODIGO_INT"}).text comuna = paradero.find("kml:SimpleData", {"name": "COMUNA"}).text recorridos = paradero.find("kml:SimpleData", {"name": "RECORRIDOS"}).text tamano = paradero.find("kml:SimpleData", {"name": "SUPERFICIE"}).text capacidad = paradero.find("kml:SimpleData", {"name": "CAPACIDAD"}).text materialpiso = paradero.find("kml:SimpleData", {"name": "RADIER_MAT"}).text materialpared = paradero.find("kml:SimpleData", {"name": "PARED_POS2"}).text materialtecho = paradero.find("kml:SimpleData", {"name": "TECHUMBRE2"}).text match = None for radio in [0.00000001, 0.00000002, 0.00000003, 0.00000004, 0.00000005, 0.000000075, 0.0000001, 0.0000002]: match = Paradero.query.filter(((Paradero.latitud-lat)*(Paradero.latitud-lat)+(Paradero.longitud-lng)*(Paradero.longitud-lng)) < radio).first() if match is not None: break if match is None: nuevo += 1 nombre = "{} cerca {}".format(paradero.find("kml:SimpleData", {"name": "NOMBRE_DE_"}).text, paradero.find("kml:SimpleData", {"name": "CALLE_CERC"}).text) match = Paradero(id=codigo, codigo=codigo, nombre=nombre, latitud=lat, longitud=lng) db.session.add(match) db.session.commit() else: existen += 1 match.codigo = codigo match.comuna = comuna match.recorridos2 = recorridos match.tamano = tamano match.capacidad = capacidad match.techo = materialtecho match.pared = materialpared match.piso = materialpiso db.session.commit() current_app.logger.info("Cargados {} paraderos existentes y {} nuevos".format(existen, nuevo))