public static List <Ruta> CrearRutasEnRango(ProyectoAutoContext _db, HistorialDiario _histDia, DateTime _desde, DateTime _hasta) { List <Ruta> rutas = new List <Ruta>(); List <HistorialPosicion> listaActual = new List <HistorialPosicion>(); for (int i = 0; i < _histDia.historialesPosicion.Count; i++) { HistorialPosicion puntoActual = _histDia.historialesPosicion[i]; if (puntoActual.Inicio == true) { if (listaActual.Count > 0) { Ruta nruta = new Ruta(_db, listaActual, _histDia); if (nruta.Puntos.Count > 0) { rutas.Add(nruta); } } listaActual = new List <HistorialPosicion>(); } if (puntoActual.FechaHora >= _desde && puntoActual.FechaHora <= _hasta) { listaActual.Add(puntoActual); } } rutas.Add(new Ruta(_db, listaActual, _histDia)); return(rutas); }
public Ruta(ProyectoAutoContext _db, List <HistorialPosicion> _puntos, HistorialDiario _histDia) { if (_puntos.Count == 0) { return; } List <HistorialPosicion> puntos = _puntos.OrderBy(p => p.FechaHora).ToList(); #region Filtro SPIKES //la suma de los dos siguientes segmentos //noo deberia ser mayor a la distancia del primer a tercer punto x 3 //En este filtro el primer punto es aceptado por default //A partir del "indexOrigen", se evalua si se agrega al filtro el "indexOrigen" + 1 float multiploLimite = 1.5f; List <HistorialPosicion> filtro = new List <HistorialPosicion>(); filtro.Add(puntos[0]); //int indexOrigen = 0; for (int i = 0; i < puntos.Count; i++) { if (i < puntos.Count - 2) { var origen = new GeoCoordinate(puntos[i].Latitud, puntos[i].Longitud); var evaluar = new GeoCoordinate(puntos[i + 1].Latitud, puntos[i + 1].Longitud); var final = new GeoCoordinate(puntos[i + 2].Latitud, puntos[i + 2].Longitud); if (puntos[i + 1].GPSOffBool == true) { continue; } double de1a2 = origen.GetDistanceTo(evaluar); double de2a3 = evaluar.GetDistanceTo(final); double de1a3 = origen.GetDistanceTo(final); double suma = de1a2 + de2a3; if (suma <= de1a3 * multiploLimite) { filtro.Add(puntos[i + 1]); } } else if (i == puntos.Count - 2) { filtro.Add(puntos[i + 1]); } } filtro = filtro.OrderBy(h => h.FechaHora).ToList(); #endregion puntos = filtro; #region Filtro distancia float distanciaLimite = 150; //metros float distanciaMinima = 6; List <HistorialPosicion> filtroDistancia = new List <HistorialPosicion>(); //int indexOrigen = 0; for (int i = 0; i < puntos.Count - 1; i++) { if (puntos[i].GPSOffBool == true) { continue; } var origen = new GeoCoordinate(puntos[i].Latitud, puntos[i].Longitud); var final = new GeoCoordinate(puntos[i + 1].Latitud, puntos[i + 1].Longitud); double distancia = origen.GetDistanceTo(final); if (distancia <= distanciaLimite && distancia >= distanciaMinima) { filtroDistancia.Add(puntos[i]); } } filtroDistancia = filtroDistancia.OrderBy(h => h.FechaHora).ToList(); #endregion puntos = filtroDistancia; if (puntos.Count == 0) { Puntos = new List <HistorialPosicion>(); return; } Puntos = puntos; double metrosRecorridos = 0; for (int i = 0; i < puntos.Count - 1; i++) { var sCoord = new GeoCoordinate(puntos[i].Latitud, puntos[i].Longitud); var eCoord = new GeoCoordinate(puntos[i + 1].Latitud, puntos[i + 1].Longitud); metrosRecorridos += sCoord.GetDistanceTo(eCoord); } double km = metrosRecorridos / 1000f; KilometrosRecorridos = Math.Round(km, 2, MidpointRounding.AwayFromZero); DateTime desde = puntos.First().FechaHora; DateTime hasta = puntos.Last().FechaHora; List <float> filtroVelocidades = new List <float>(); float sumaVelocidades = 0; foreach (HistorialVelocidad hv in _histDia.historialesVelocidad) { if (hv.HoraRegistro >= desde && hv.HoraRegistro <= hasta) { filtroVelocidades.Add(hv.ValorInicio); sumaVelocidades += hv.ValorInicio; filtroVelocidades.Add(hv.ValorUnCuarto); sumaVelocidades += hv.ValorUnCuarto; filtroVelocidades.Add(hv.ValorMitad); sumaVelocidades += hv.ValorMitad; filtroVelocidades.Add(hv.ValorTresCuartos); sumaVelocidades += hv.ValorTresCuartos; filtroVelocidades.Add(hv.ValorFinal); sumaVelocidades += hv.ValorFinal; filtroVelocidades.Add(hv.ValorMayor); sumaVelocidades += hv.ValorMayor; filtroVelocidades.Add(hv.ValorMenor); sumaVelocidades += hv.ValorMenor; } } if (filtroVelocidades.Count > 0) { VelocidadPromedio = sumaVelocidades / filtroVelocidades.Count; } HistorialPosicion inicioHP = puntos.First(); HistorialPosicion finalHP = puntos.Last(); if (inicioHP.NombreCalle == null) { inicioHP.NombreCalle = ""; } if (inicioHP.NombreLocalidad == null) { inicioHP.NombreLocalidad = ""; } if (finalHP.NombreCalle == null) { finalHP.NombreLocalidad = ""; } if (finalHP.NombreLocalidad == null) { finalHP.NombreLocalidad = ""; } if (inicioHP.NombreCalle == "" || inicioHP.NombreLocalidad == "") { List <Placemark> datosInicio = Posicion.ObtenerDatosPosición(puntos.First().Latitud, puntos.First().Longitud); if (datosInicio != null) { if (inicioHP.NombreCalle == "") { inicioHP.NombreCalle = datosInicio[0].ThoroughfareName; } if (inicioHP.NombreLocalidad == "") { inicioHP.NombreLocalidad = datosInicio[0].LocalityName; } } } if (finalHP.NombreCalle == "" || finalHP.NombreLocalidad == "") { List <Placemark> datosFinal = Posicion.ObtenerDatosPosición(puntos.Last().Latitud, puntos.Last().Longitud); if (datosFinal != null) { if (finalHP.NombreCalle == "") { finalHP.NombreCalle = datosFinal[0].ThoroughfareName; } if (finalHP.NombreLocalidad == "") { finalHP.NombreLocalidad = datosFinal[0].LocalityName; } } } _db.SaveChanges(); NombreCalleInicio = inicioHP.NombreCalle; NombreCiudadInicio = inicioHP.NombreLocalidad; NombreCalleFinal = finalHP.NombreCalle; NombreCiudadFinal = finalHP.NombreLocalidad; //NombreCalleInicio = ""; //NombreCiudadInicio = ""; //NombreCalleFinal = ""; //NombreCiudadFinal = ""; //List<Placemark> datosInicio = Posicion.ObtenerDatosPosición(puntos.First().Latitud, puntos.First().Longitud); //if (datosInicio != null) //{ // NombreCalleInicio = datosInicio[0].ThoroughfareName; // NombreCiudadInicio = datosInicio[0].LocalityName; //} //List<Placemark> datosFinal = Posicion.ObtenerDatosPosición(puntos.Last().Latitud, puntos.Last().Longitud); //if(datosFinal != null) //{ // NombreCalleFinal = datosFinal[0].ThoroughfareName; // NombreCiudadFinal = datosFinal[0].LocalityName; //} }
//POST: odata/Autos/ActualizarPosicionListaDX //Parametros: Id,ListaPosiciones //(FechaHora,MetrosTramo,Latitud,Longitud,Inicio) public string ActualizarPosicionListaDX(ODataActionParameters parameters) { if (parameters == null) { return("Error"); } int id = (int)parameters["Id"]; var posiciones = parameters["ListaPosiciones"] as IEnumerable <Posicion>; List <Posicion> listaPosiciones = posiciones.ToList(); List <HistorialPosicion> hisPosicion = new List <HistorialPosicion>(); Auto auto = db.Autos.Where(a => a.Id == id).FirstOrDefault(); if (auto == null) { return("Error"); } for (int i = 0; i < listaPosiciones.Count; i++) { double latitud = listaPosiciones[i].Latitud; double longitud = listaPosiciones[i].Longitud; string horaString = listaPosiciones[i].FechaHora; float distanciaTramo = listaPosiciones[i].MetrosTramo; bool inicio = listaPosiciones[i].Inicio; DateTime horaRegistro; bool result = DateTime.TryParseExact(horaString, FormatoFecha.formato, FormatoFecha.provider, DateTimeStyles.None, out horaRegistro); if (result == false) { return("Error"); } HistorialPosicion hp = new HistorialPosicion(); hp.FechaHora = horaRegistro; hp.Latitud = latitud; hp.Longitud = longitud; hp.MetrosTramo = distanciaTramo; hp.Inicio = inicio; hisPosicion.Add(hp); } if (hisPosicion.Count == 0) { return("Error"); } List <HistorialDiario> historiales = auto.HistorialesDiarios.ToList(); historiales.Reverse(); DateTime fechaHoy = DateTime.Today; HistorialDiario historialHoy = historiales.Where(h => h.Fecha.Year == fechaHoy.Year && h.Fecha.Month == fechaHoy.Month && h.Fecha.Day == fechaHoy.Day).FirstOrDefault(); if (historialHoy == null) { historialHoy = new HistorialDiario() { //Fecha = hisPosicion[hisPosicion.Count -1].FechaHora.Date, Fecha = fechaHoy, historialesEnergia = new List <HistorialEnergia>(), historialesPosicion = new List <HistorialPosicion>(), historialesVelocidad = new List <HistorialVelocidad>() }; auto.HistorialesDiarios.Add(historialHoy); } //------SE FILTRAN LOS HISTORIALES OBTENIDOS-------------- //A partir del primer punto, solo se agregan un punto siguiente si supera los 25 metros del filtro #region TEST METROS POR TRAMO List <double> metrosTramos = new List <double>(); for (int i = 0; i < hisPosicion.Count - 1; i++) { var sCoord = new GeoCoordinate(hisPosicion[i].Latitud, hisPosicion[i].Longitud); var eCoord = new GeoCoordinate(hisPosicion[i + 1].Latitud, hisPosicion[i + 1].Longitud); metrosTramos.Add(sCoord.GetDistanceTo(eCoord)); } #endregion int metrosFiltro = 25; List <HistorialPosicion> filtro = new List <HistorialPosicion>(); filtro.Add(hisPosicion[0]); int indexOrigen = 0; for (int i = 0; i < hisPosicion.Count; i++) { if (i > indexOrigen) { var sCoord = new GeoCoordinate(hisPosicion[indexOrigen].Latitud, hisPosicion[indexOrigen].Longitud); //a partir del index de origen se busca el primer punto a distancia mayor de 25 metros //el index de ese punto se convierte en el indexorigen for (int y = (indexOrigen + 1); y < hisPosicion.Count; y++) { var eCoord = new GeoCoordinate(hisPosicion[y].Latitud, hisPosicion[y].Longitud); double metrosDistancia = sCoord.GetDistanceTo(eCoord); if (metrosDistancia > metrosFiltro) { filtro.Add(hisPosicion[y]); indexOrigen = y; break; } } } } for (int i = 0; i < filtro.Count; i++) { historialHoy.historialesPosicion.Add(filtro[i]); } HistorialPosicion ultimaPosicion = filtro[filtro.Count - 1]; auto.Latitud = ultimaPosicion.Latitud; auto.Longitud = ultimaPosicion.Longitud; db.SaveChanges(); return("Ok"); }
//POST: odata/Autos/ActualizarPosicionListaDXZGPS //Parametros: Id,ListaPosiciones //(FechaHora,MetrosTramo,Latitud,Longitud,Inicio) public string ActualizarPosicionListaDXZGPS(ODataActionParameters parameters) { if (parameters == null) { return("Error"); } try { int id = (int)parameters["Id"]; var posiciones = parameters["ListaPosiciones"] as IEnumerable <Posicion>; List <Posicion> listaPosiciones = posiciones.ToList(); List <HistorialPosicion> hisPosicion = new List <HistorialPosicion>(); Auto auto = db.Autos.Where(a => a.Id == id).FirstOrDefault(); if (auto == null) { return("Error"); } for (int i = 0; i < listaPosiciones.Count; i++) { double latitud = listaPosiciones[i].Latitud; double longitud = listaPosiciones[i].Longitud; string horaString = listaPosiciones[i].FechaHora; float distanciaTramo = listaPosiciones[i].MetrosTramo; bool inicio = listaPosiciones[i].Inicio; bool gpsOff = listaPosiciones[i].GPSOffBool; DateTime horaRegistro; bool result = DateTime.TryParseExact(horaString, FormatoFecha.formato, FormatoFecha.provider, DateTimeStyles.None, out horaRegistro); if (result == false) { return("Error"); } HistorialPosicion hp = new HistorialPosicion(); hp.FechaHora = horaRegistro; hp.Latitud = latitud; hp.Longitud = longitud; hp.MetrosTramo = distanciaTramo; hp.Inicio = inicio; hp.NombreCalle = ""; hp.NombreLocalidad = ""; hp.GPSOffBool = gpsOff; hisPosicion.Add(hp); } if (hisPosicion.Count == 0) { return("Error"); } hisPosicion = hisPosicion.OrderBy(h => h.FechaHora).ToList(); List <HistorialDiario> HistDiarioEnRango = CrearHistorialesDiariosEnRango(hisPosicion.First().FechaHora, hisPosicion.Last().FechaHora, auto); //------SE FILTRAN LOS HISTORIALES OBTENIDOS-------------- //A partir del primer punto, solo se agregan un punto siguiente si supera los 25 metros del filtro int metrosFiltro = 25; List <HistorialPosicion> filtro = new List <HistorialPosicion>(); filtro.Add(hisPosicion[0]); int indexOrigen = 0; for (int i = 0; i < hisPosicion.Count; i++) { if (i > indexOrigen) { var sCoord = new GeoCoordinate(hisPosicion[indexOrigen].Latitud, hisPosicion[indexOrigen].Longitud); //a partir del index de origen se busca el primer punto a distancia mayor de 25 metros //el index de ese punto se convierte en el indexorigen for (int y = (indexOrigen + 1); y < hisPosicion.Count; y++) { var eCoord = new GeoCoordinate(hisPosicion[y].Latitud, hisPosicion[y].Longitud); double metrosDistancia = sCoord.GetDistanceTo(eCoord); if (metrosDistancia > metrosFiltro) { filtro.Add(hisPosicion[y]); indexOrigen = y; break; } } } } for (int i = 0; i < filtro.Count; i++) { HistorialDiario histCorrespondiente = HistDiarioEnRango.Where(h => h.Fecha.Year == filtro[i].FechaHora.Year && h.Fecha.Month == filtro[i].FechaHora.Month && h.Fecha.Day == filtro[i].FechaHora.Day).FirstOrDefault(); histCorrespondiente.historialesPosicion.Add(filtro[i]); } HistorialPosicion ultimaPosicion = filtro[filtro.Count - 1]; auto.Latitud = ultimaPosicion.Latitud; auto.Longitud = ultimaPosicion.Longitud; db.SaveChanges(); return("Ok"); } catch { return("CatchWebService"); } }
public static List <HistorialPosicion> CrearHistorialPosicionejemplo() { List <HistorialPosicion> ejemplo = new List <HistorialPosicion>(); HistorialPosicion h1 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 8, 0, 0), Latitud = -40.573431, Longitud = -73.112800 }; ejemplo.Add(h1); HistorialPosicion h2 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 9, 0, 0), Latitud = -40.572127, Longitud = -73.129794 }; ejemplo.Add(h2); HistorialPosicion h3 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 10, 0, 0), Latitud = -40.577342, Longitud = -73.129236 }; ejemplo.Add(h3); HistorialPosicion h4 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 11, 0, 0), Latitud = -40.577244, Longitud = -73.138291 }; ejemplo.Add(h4); HistorialPosicion h5 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 12, 0, 0), Latitud = -40.568476, Longitud = -73.139021 }; ejemplo.Add(h5); HistorialPosicion h6 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 13, 0, 0), Latitud = -40.567335, Longitud = -73.144943 }; ejemplo.Add(h6); HistorialPosicion h7 = new HistorialPosicion() { FechaHora = new DateTime(2018, 1, 1, 14, 30, 0), Latitud = -40.570464, Longitud = -73.157346 }; ejemplo.Add(h7); return(ejemplo); }