print("Conectado") print("Preparando datos") dfP = pd.DataFrame(data=rows, columns=[ 'codigo_estacion', 'nombre_estacion', 'latitud', 'longitud', 'fecha_observacion', 'valor_registrado', 'valor_corregido' ]) print("Inicio de bucle") analisis_data, ArrayCentroides = [], [] historialDescargas = [None] * 9 while tiempoAnalizarIni <= diaAnalizarFin: plot = plt.Plot() query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S') + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico densidad = 0 HoraFinalCelula = None HoraInicialCelula = None EvoPuntoInicial = [] EvoPuntoFinal = [] printPossibleWeather = False
dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2 c = 2 * atan2(sqrt(a), sqrt(1 - a)) distance = R * c return distance # print("Distancia:", distance) if __name__ == '__main__': plot = plt.Plot() # plot.drawIntoMap(-57.623154, -25.280073,1) # plot.drawIntoMap(-57.603154, -25.284073, 1) # plot.printMap() # exit(0) inicio_de_tiempo = time.time() database_connection = db.DatabaseConnection() # DATOS DE ANALISIS DE PRUEBA diaAnalizarIni = datetime.strptime('2016-11-19 13:00:00', '%Y-%m-%d %H:%M:%S') diaAnalizarFin = datetime.strptime('2016-11-19 18:56:59', '%Y-%m-%d %H:%M:%S') # coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion coordenadaAnalizar = '-55.873211,-27.336775' # Encarnacion - Playa San Jose tiempoIntervalo = 10 # minutos
def SVM(diaAnalizarIni, diaAnalizarFin, coordenadaAnalizar): SVM = ML.ML_SVM(False) tormentaDetectada = False inicio_de_tiempo = time.time() # DATOS DE ANALISIS DE PRUEBA diaAnalizarIni = datetime.strptime(diaAnalizarIni, '%Y-%m-%d %H:%M') diaAnalizarFin = datetime.strptime(diaAnalizarFin, '%Y-%m-%d %H:%M') # coordenadaAnalizar = '-57.606765,-25.284659' # Asuncion # coordenadaAnalizar = '-55.873211,-27.336775' # Encarnacion - Playa San Jose tiempoIntervalo = 10 # minutos # DATOS DE ANALISIS EN TIEMPO REAL # diaAnalizarIni = datetime.now() - timedelta(minutes=15) # diaAnalizarFin = datetime.now() diametroAnalizar = '45000' # en metros # Definicion de tiempos a ser analizados, estas variables iran iterando en un bucle segun el tiempoIntervalo tiempoAnalizarIni = diaAnalizarIni tiempoAnalizarFin = tiempoAnalizarIni + timedelta(minutes=tiempoIntervalo) print("Conectando a la base de datos...Descargas") # Conexion a la base de datos de descargas electricas database_connection = db.DatabaseConnection('', 'rayos', 'cta', '') rows = database_connection.query( "SELECT start_time,end_time,type,latitude,longitude,peak_current,ic_height,number_of_sensors,ic_multiplicity,cg_multiplicity,geom FROM lightning_data WHERE ST_DistanceSphere(geom, ST_MakePoint(" + coordenadaAnalizar + ")) <= " + diametroAnalizar + " AND start_time >= to_timestamp('" + str(diaAnalizarIni) + "', 'YYYY-MM-DD HH24:MI:SS.MS') AND start_time <= to_timestamp('" + str(diaAnalizarFin) + "', 'YYYY-MM-DD HH24:MI:SS.MS')") print("Conectado") print("Preparando datos") df = pd.DataFrame(data=rows, columns=[ 'start_time', 'end_time', 'type', 'latitude', 'longitude', 'peak_current', 'ic_height', 'number_of_sensors', 'ic_multiplicity', 'cg_multiplicity', 'geom' ]) print("Inicio de bucle") analisis_data, ArrayCentroides = [], [] historialDescargas = [None] * 9 printPossibleWeather = False while tiempoAnalizarIni <= diaAnalizarFin: plot = plt.Plot() query = 'start_time >="' + datetime.strftime( tiempoAnalizarIni, '%Y-%m-%d %H:%M:%S') + '" and start_time<="' + datetime.strftime( tiempoAnalizarFin, '%Y-%m-%d %H:%M:%S') + '"' datosAnalisis = df.query(query) peak_current = 0 # Corriente pico densidad = 0 HoraFinalCelula = None HoraInicialCelula = None EvoPuntoInicial = [] EvoPuntoFinal = [] printPossibleWeather = False histLatLon = [] if not datosAnalisis.empty: # Rayos Intra Cloud plotRayosic = PlotOnMap.PlotOnGeoJSON() # Rayos Cloud ground plotRayoscg = PlotOnMap.PlotOnGeoJSON() # Obtenemos las descargas eléctricas en el tiempo analizado for i, row in enumerate(datosAnalisis.itertuples(), 1): # Para la predicción solo se tienen en cuenta descargas del tipo 1 (CG) if row.type == 1: peak_current += abs(row.peak_current) histLatLon.append([row.latitude, row.longitude]) if row.type == 1: # Rayos CG plotRayoscg.addFeature( row.longitude, row.latitude, { 'start_time': "'" + str(row.start_time) + "'", 'end_time': "'" + str(row.end_time) + "'", 'type': str(row.type), 'peak_current': str(row.peak_current) }) if row.type == 0: # Rayos IC plotRayosic.addFeature( row.longitude, row.latitude, { 'start_time': "'" + str(row.start_time) + "'", 'end_time': "'" + str(row.end_time) + "'", 'type': str(row.type), 'peak_current': str(row.peak_current) }) densidad += 1 # poner los valores en base 100000, Ej: 1.000.000 = 10 peak_current = peak_current / 100000 peak_current = round(peak_current, 1) if histLatLon: for idx, item in enumerate(historialDescargas): historialDescargas.insert(idx, histLatLon) historialDescargas.pop() break # Si hablamos de otra celula, resetamos el historico de descargas if peak_current <= 0.5: historialDescargas = [None] * 9 qtyCells = (sum(x is not None for x in historialDescargas)) # Obtenemos la predicción generada por MachineLearning.py prediccion = SVM.obtenerPrediccion(qtyCells, peak_current) printPossibleWeather = True if prediccion == 10 else False # Si la predicción da como una posible tormenta, se debe plotear la tormenta y su evolución if printPossibleWeather: # Si supera los 1.000.000 de pico de corriente # Generar poligono de los ultimos 90 minutos, o de los ultimos 9 registros consultados if HoraFinalCelula is None: HoraFinalCelula = tiempoAnalizarIni ArrayCentroides = [] if qtyCells <= 4: print( str(tiempoAnalizarFin) + " tormenta en 1h " + str(tiempoAnalizarFin + timedelta(minutes=60))) tormentaDetectada = True # if qtyCells >= 8: if qtyCells >= 3: # Recorrer estado de tormentas 90 minutos antes for idx, item in enumerate(historialDescargas): fileName = str(tiempoAnalizarFin).replace(":", "").replace( ".", "") fileName = "CELULA_" + str(APP_KEY) + "_" + str(idx) # plotCel = plt.Plot() plotGeo = PlotOnMap.PlotOnGeoJSON() points = [] if item is not None: for k, r in enumerate(item): # plotCel.drawIntoMap(r[1], r[0], 1) # plotGeo.addFeature(r[1], r[0]) points.append([r[1], r[0]]) # Si hay descargas eléctricas saveFile = False if points and len(points) >= 3: saveFile = True points = np.array(points) # Generamos un poligono que contenga todas las descargas electricas hull = ConvexHull(points, qhull_options="QJ") # plotCel.draw(points, hull) plotGeo.draw(points, hull) # Obtenemos el centroide de nuestro poligono cx = np.mean(hull.points[hull.vertices, 0]) cy = np.mean(hull.points[hull.vertices, 1]) # Si no existe un punto inicial de la tormenta, asignamos if not EvoPuntoInicial: EvoPuntoInicial = [cx, cy] # El punto final de nuestra tormenta es el ultimo dato consultado EvoPuntoFinal = [cx, cy] # Generamos un array con todos nuestros centroides ArrayCentroides.append([cx, cy]) # Dibujamos los centroides en el mapa # plotCel.drawIntoMap(cx, cy, 2) # plotGeo.addFeature(cx,cy) # Imprimimos en una imagen cada una de las 9 celulas if saveFile: # plotCel.saveToFile(fileName) collCut = str(tiempoAnalizarFin).find(' ') collectionTitle = str(tiempoAnalizarFin)[collCut:] collectionTitle = 'Celula ' + collectionTitle fc = plotGeo.getFeatureCollection(collectionTitle) # plotGeo.dumpGeoJson(fc, fileName+'.geojson') POL_GEOJSON.append(plotGeo.dumpGeoJson(fc)) # Si tenemos un inicio y un fin de nuestra tormenta if EvoPuntoFinal and EvoPuntoInicial and ArrayCentroides: # distancia = MedirDistancia(EvoPuntoInicial[0], EvoPuntoInicial[1], EvoPuntoFinal[0], EvoPuntoFinal[1]) # if HoraInicialCelula and HoraFinalCelula: # tiempoDesplazamiento = HoraFinalCelula - HoraInicialCelula # tiempoDesplazamiento = tiempoDesplazamiento / timedelta(hours=1) # velocidad = distancia / tiempoDesplazamiento # print("Se desplazó " + str(distancia) + "km en " + str( # tiempoDesplazamiento) + " horas. A una velocidad de " + str(velocidad) + " km/h") X = [point[0] for point in ArrayCentroides] X = np.array(X) Y = [point[1] for point in ArrayCentroides] Y = np.array(Y) # Dibujamos los datos para poder visualizarlos y ver si sería lógico # considerar el ajuste usando un modelo lineal # plot(X, Y, 'o') # Para dibujar la recta fileName = str(tiempoAnalizarFin).replace(":", "").replace(".", "") fileName = "RECTA_" + str(APP_KEY) + "_" + fileName plotRecta = PlotOnMap.PlotOnGeoJSON() plotRecta.makePath(X, Y) collectionTitle = 'Posible trayectoria' fc = plotRecta.getFeatureCollection(collectionTitle) # plotRecta.dumpGeoJson(fc, fileName + '.geojson') TRA_GEOJSON.append(plotRecta.dumpGeoJson(fc)) # Calculamos los coeficientes del ajuste (a X + b) a, b = np.polyfit(X, Y, 1) # Calculamos el coeficiente de correlación r = np.corrcoef(X, Y) # Dibujamos los datos para poder visualizarlos y ver si sería lógico # considerar el ajuste usando un modelo lineal # Coordenadas X e Y sobre la recta (np.max(X), a * np.max(X) + b, '+') # nueva_distancia = velocidad * 0.16 # velocidad de desplazamiento * tiempo esperado de llegada en horas # nuevo_x, nuevo_y = CalcularSigtePunto(np.min(X), a * np.min(X) + b, np.max(X), a * np.max(X) + b, # nueva_distancia) # # plot = plt.Plot() # # plot.drawIntoMap(nuevo_x, nuevo_y, 4) # fileName = "punto_futuro" # # plot.saveToFile(fileName) # plot = plt.Plot() # # print("Se desplazó " + str(distancia) + "km en " + str( # tiempoDesplazamiento) + " horas. A una velocidad de " + str( # velocidad) + " km/h" + " nueva Lat:" + str(nuevo_x) + " Lon:" + str(nuevo_y)) # Texto generado para mostrar, dando una conclusion de la lectura txt = ( "En fecha hora " + str(tiempoAnalizarIni) + " se tuvo una intensidad de " + str(peak_current) + "A en " + str(densidad) + " descargas eléctricas en donde luego de 50m a 1h:10m la predicción es " + ("+=10mm probabilidad de Tormentas severas" if prediccion == 10 else "+=5mm probabilidad de Lluvias muy fuertes" if prediccion == 5 else "+=0 probabilidad baja o nula de lluvias")) analisis_data.append( [tiempoAnalizarIni, peak_current, densidad, prediccion, txt]) # fileName = str(tiempoAnalizarFin).replace(":", "").replace(".", "") # fileName = "RAYOS_" + str(APP_KEY) + "_" + fileName collCut = str(tiempoAnalizarFin).find(' ') collectionTitle = str(tiempoAnalizarFin)[collCut:] # plotRayos.dumpGeoJson(fc, fileName + '.geojson') RAYOSIC_GEOJSON.append( plotRayosic.dumpGeoJson( plotRayosic.getFeatureCollection(collectionTitle))) RAYOSCG_GEOJSON.append( plotRayoscg.dumpGeoJson( plotRayoscg.getFeatureCollection(collectionTitle))) tiempoAnalizarIni = tiempoAnalizarFin tiempoAnalizarFin = tiempoAnalizarIni + timedelta( minutes=tiempoIntervalo) # plot.printMap() # SVM.guardarModelo() tiempo_final = time.time() tiempo_transcurrido = tiempo_final - inicio_de_tiempo print("Tiempo transcurrido de análisis: " + str(tiempo_transcurrido) + " segundos") return { 'tormenta': tormentaDetectada, 'tiempo': tiempo_transcurrido, 'rayosic.geojson': RAYOSIC_GEOJSON, 'rayoscg.geojson': RAYOSCG_GEOJSON, 'pol.geojson': POL_GEOJSON, 'tra.geojson': TRA_GEOJSON } """"