public void addEventoGPS(string id_hh, EventoGPS v_evento) { try { StaticTools.obtenerMutex_ListaEventosGPS(); if (!listaEventosGPS.ContainsKey(id_hh)) { listaEventosGPS.Add(id_hh, new List<EventoGPS>()); } if (listaEventosGPS.ContainsKey(id_hh)) { List<EventoGPS> eventos = listaEventosGPS[id_hh]; eventos.Add(v_evento); } } catch (Exception ex) { loguearString("Excepcion en addEventoGPS: " + ex.Message,TiposLOG.HH); } finally { StaticTools.liberarMutex_ListaEventosGPS(); } SqlConnection cnn = new SqlConnection(conexion); SqlCommand cmd = new SqlCommand("AgregarEventosGps", cnn); try { cnn.Open(); cmd = cnn.CreateCommand(); cmd.CommandText = "insert into EventosGps(hhid,latitud,longitud,Hora)values('" + v_evento.HHID+ "','" + v_evento.Latitud + "','"+v_evento.Longitud+"','" + v_evento.Hora+"')"; cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); } catch (Exception ex) { loguearString("Excepcion en addEventoGPS del HH: " + id_hh + " - " + ex.Message, TiposLOG.HH); } finally { cnn.Close(); } }
/// <summary> /// Actualiza localmente el ultimo dato GPS recibido y lanza el evento que verifica los accesos a las Virtual gates. /// </summary> /// <param name="sender"></param> /// <param name="v_eventArgs"></param> void actualizeGPS(object sender, stringEventArgs v_eventArgs) { string HHID = v_eventArgs.textData["HHID"]; string latitud = v_eventArgs.textData["LATITUD"]; string longitud = v_eventArgs.textData["LONGITUD"]; string hora = v_eventArgs.textData["HORA"]; EventoGPS nuevoEvento = new EventoGPS(HHID, mainApp.InterpretarLatitud(latitud), mainApp.InterpretarLongitud(longitud), hora); EventoGPS ultimoEvento = mainApp.DataManager.getLastEventoGPS(HHID); mainApp.DataManager.addEventoGPS(HHID, nuevoEvento); mainApp.DataManager.updateVirtualGateEvents(ultimoEvento, nuevoEvento); }
/// <summary> /// /// </summary> public Dictionary<string, List<EventoGPS>> LoadEventosGPS() { //Aca cargo todos los eventos gps desde base de datos Sql Server. int id = 0; string hhid = ""; string latitud = ""; string longitud = ""; string hora = ""; SqlConnection cnn = new SqlConnection(conexion); try { StaticTools.obtenerMutex_ListaEventosGPS(); SqlCommand cmd = new SqlCommand("ListarGpsEventos", cnn); cmd.CommandType = CommandType.StoredProcedure; cnn.Open(); SqlDataReader lector = cmd.ExecuteReader(); while (lector.Read()) { id = Convert.ToInt32(lector["id"].ToString()); hhid = lector["hhid"].ToString(); latitud = lector["latitud"].ToString(); longitud = lector["longitud"].ToString(); hora = lector["hora"].ToString(); if (!listaEventosGPS.ContainsKey(hhid)) { List<EventoGPS> listaEvento = new List<EventoGPS>(); listaEventosGPS.Add(hhid, listaEvento); } EventoGPS nuevoEvento = new EventoGPS(hhid, latitud, longitud, hora); listaEventosGPS[hhid].Add(nuevoEvento); } } catch (Exception ex) { loguearString("Excepcion en LoadEventosGPS() - " + ex.Message,TiposLOG.HH); } finally { cnn.Close(); StaticTools.liberarMutex_ListaEventosGPS(); } return listaEventosGPS; }
/// <summary> /// Nueva version: Utiliza las tablas originales del ALUTRACK para chequear los accesos a puertas virtuales. /// </summary> /// <param name="GPSDesde"></param> /// <param name="GPSHacia"></param> public void updateVirtualGateEvents(EventoGPS GPSDesde, EventoGPS GPSHacia) { // El movimiento se obtuvo desde A hacia B en coordenadas cartesianas Punto A = new Punto(float.Parse(GPSDesde.Latitud, CultureInfo.InvariantCulture.NumberFormat), float.Parse(GPSDesde.Longitud, CultureInfo.InvariantCulture.NumberFormat)); Punto B = new Punto(float.Parse(GPSHacia.Latitud, CultureInfo.InvariantCulture.NumberFormat), float.Parse(GPSHacia.Longitud, CultureInfo.InvariantCulture.NumberFormat)); string HHID = GPSDesde.HHID; int orgID = obtenerOrganizationIDFromHHID(HHID); if (orgID > 0) // Tengo la Organizacion y el Nombre del Device GPS. { // Busco la tarjeta asociada a ese empleadoGPS, de esa organizacion: Busco por Nombre y Organizacion... weak... int IDEmpleadoGPS = obtenerEmpleadoGPS(HHID,orgID); // El ID del empleado correspondiente al GPS if (IDEmpleadoGPS >0) { string TarjetaEmpleadoGPS = obtenerTarjetaGPS(IDEmpleadoGPS, orgID); // La tarjeta de ese empleado if (TarjetaEmpleadoGPS != "") { // Ahora obtengo la lista de idFeatures de la organizacion. Dictionary<int, string> listaIDFeatures = obtenerListaFeatures(orgID); // Ahora cargo las zonas correspondientes a las features Dictionary<string, Zone> listaZonas = LoadZonasFromFeatures(listaIDFeatures); // Ahora chequeo la interseccion de las Zonas.... foreach (KeyValuePair<string, Zone> zone in listaZonas) { foreach (KeyValuePair<string, Zone.GateDefinition> gate in zone.Value.listaPuertas) { Punto C = new Punto(float.Parse(gate.Value.from.position.latitude, CultureInfo.InvariantCulture.NumberFormat), float.Parse(gate.Value.from.position.longitude, CultureInfo.InvariantCulture.NumberFormat)); Punto D = new Punto(float.Parse(gate.Value.to.position.latitude, CultureInfo.InvariantCulture.NumberFormat), float.Parse(gate.Value.to.position.longitude, CultureInfo.InvariantCulture.NumberFormat)); if (intersecta(A, B, C, D)) { TiposAcceso tipoAcceso; // El punto intersecto un segmento. // Uso el algoritmo Ray Casting para saber si quedo dentro o fuera de la zona. //Algoritmo RAYCAST: devuelve la cantidad de intersecciones al poligono: Si es un numero impar, es entrada. Si es un numero par, es salida int numInter = RayCast(zone.Value, B); if (numInter % 2 != 0) // Chequea si es impar, entonces es entrada { tipoAcceso = TiposAcceso.Entrada; } else // Si es par es salida. { tipoAcceso = TiposAcceso.Salida; } TiposAcceso tipoEvento = TiposAcceso.INVALIDO; // Por defecto... switch (gate.Value.type) { case GateAccessType.Granted: tipoEvento = tipoAcceso; break; case GateAccessType.Forbidden: tipoEvento = TiposAcceso.INVALIDO; break; case GateAccessType.Entrance: if (tipoAcceso == TiposAcceso.Entrada) { tipoEvento = TiposAcceso.Entrada; } else { tipoEvento = TiposAcceso.EINVALIDO; } break; case GateAccessType.Exit: if (tipoAcceso == TiposAcceso.Salida) { tipoEvento = TiposAcceso.Salida; } else { tipoEvento = TiposAcceso.SINVALIDO; } break; } //ZoneAccess nuevoAcceso = new ZoneAccess(GPSDesde.HHID, zone.Key, gate.Value.ID, GPSHacia.Hora, tipoEvento); agregarAccesoDesdeGPS(IDEmpleadoGPS, GPSHacia.Latitud, GPSHacia.Longitud, HHID, GPSHacia.Hora, tipoEvento, TarjetaEmpleadoGPS, orgID,gate.Value.LNLPanelID,gate.Value.LNLReaderID); //addAccesoZona(nuevoAcceso); } } } } } } }
/// <summary> /// /// </summary> private void LoadEventosGPS() { if (File.Exists(dataSource + @"\\eventosGPS.xml")) { XmlDocument xDoc = new XmlDocument(); xDoc.Load(dataSource + @"\\eventosGPS.xml"); // toma el recurso de lista de eventos. //Aplicacion.semaforo_GPS.WaitOne(); listaEventosGPS.Clear(); foreach (XmlElement elem in xDoc.SelectNodes("/EventosGPS/Evento")) { string HHID = elem.Attributes["HHID"].Value; string latitud = elem.Attributes["latitud"].Value; string longitud = elem.Attributes["longitud"].Value; string hora = elem.Attributes["hora"].Value; if (!listaEventosGPS.ContainsKey(HHID)) { List<EventoGPS> listaEvento = new List<EventoGPS>(); listaEventosGPS.Add(HHID, listaEvento); } EventoGPS nuevoEvento = new EventoGPS(HHID,latitud,longitud,hora); listaEventosGPS[HHID].Add(nuevoEvento); } // Aplicacion.semaforo_GPS.Release(); } }
public void updateVirtualGateEvents(EventoGPS GPSDesde, EventoGPS GPSHacia) { Punto A = new Punto(float.Parse(GPSDesde.Latitud), float.Parse(GPSDesde.Longitud)); Punto B = new Punto(float.Parse(GPSHacia.Latitud), float.Parse(GPSHacia.Longitud)); foreach (KeyValuePair<string, Zone> pair in listaZonas) { foreach (KeyValuePair<string, Zone.GateDefinition> gate in pair.Value.listaPuertas) { Punto C = new Punto(float.Parse(gate.Value.from.position.latitude), float.Parse(gate.Value.from.position.longitude)); Punto D = new Punto(float.Parse(gate.Value.to.position.latitude), float.Parse(gate.Value.to.position.longitude)); if (intersecta(A, B, C, D)) { GateAccessType tipoAcceso; tipoAcceso = gate.Value.type; VehicleAccess nuevoAcceso = new VehicleAccess(GPSDesde.HHID, gate.Value.ID, GPSHacia.Hora, tipoAcceso); mainApp.DataManager.addAccesoVehiculo(nuevoAcceso); mainApp.ComunicationSystem.actualizeListViewAccesosVirtualGates = true; } } } }
public void addEventoGPS(string id_hh, EventoGPS v_evento) { if (!listaEventosGPS.ContainsKey(id_hh)) { listaEventosGPS.Add(id_hh, new List<EventoGPS>()); } if (listaEventosGPS.ContainsKey(id_hh)) { List<EventoGPS> eventos = listaEventosGPS[id_hh]; eventos.Add(v_evento); SaveEventosGPS(id_hh); } }
/// <summary> /// Analiza la diferencia de espacio y horario entre los dos eventos GPS e indica si el track se separó o no. /// El criterio para determinarlo es que la velocidad calculada entre los dos eventos no sea mayor a MAXVEL kilometros por hora. /// </summary> /// <param name="evento1"></param> /// <param name="evento2"></param> /// <returns></returns> private bool dividirTrack(EventoGPS evento1, EventoGPS evento2) { bool res = false; if (evento1 != null && evento2 != null) { DateTime hora1 = DateTime.Parse(evento1.Hora, CultureInfo.InvariantCulture.DateTimeFormat); DateTime hora2 = DateTime.Parse(evento2.Hora, CultureInfo.InvariantCulture.DateTimeFormat); TimeSpan delta = hora1.Subtract(hora2); float horas = (float)Math.Abs(delta.TotalHours); float lat1 = float.Parse(evento1.Latitud, CultureInfo.InvariantCulture.NumberFormat); float lat2 = float.Parse(evento2.Latitud, CultureInfo.InvariantCulture.NumberFormat); float deltaLat = Math.Abs(lat1 - lat2); float long1 = float.Parse(evento1.Longitud, CultureInfo.InvariantCulture.NumberFormat); float long2 = float.Parse(evento2.Longitud, CultureInfo.InvariantCulture.NumberFormat); float deltaLong = Math.Abs(long1 - long2); float distance = (float)Math.Sqrt(deltaLat * deltaLat + deltaLong * deltaLong); float distanceKiloMetros = ((distance / 0.0006f) * 50) / 1000.0f; // Distancia en kilometros float vel = distanceKiloMetros / horas; if (vel > Zone.MAXVEL) { // MessageBox.Show("vel = " + vel.ToString()); } if (distanceKiloMetros > 0.5) { // MessageBox.Show("distanceKiloMetros = " + distanceKiloMetros.ToString()); } return (vel > Zone.MAXVEL)||(distanceKiloMetros > 0.5); // Es la velocidad mayor que la permitida? o es la distancia > que la permitida? } return res; }
private void button4_Click(object sender, EventArgs e) { // latitud="-34.89684" longitud="-56.18095" hora="2012-10-16 15:41:34" string latitud = "-34.89684"; string longitud = "-56.18095"; string hora = "2012-10-16 15:41:30"; string HHID = "Nacho"; EventoGPS nuevoEvento = new EventoGPS(HHID, latitud, longitud, hora); EventoGPS ultimoEvento = mainApp.DataManager.getLastEventoGPS(HHID); mainApp.DataManager.addEventoGPS(HHID, nuevoEvento); if (ultimoEvento != null) { mainApp.DataManager.updateVirtualGateEvents(ultimoEvento, nuevoEvento); } actualizarTrackEnMapa(HHID,true,true); }