Пример #1
0
        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);
        }
Пример #2
0
        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;
            //}
        }
Пример #3
0
        //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");
        }
Пример #4
0
        //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");
            }
        }
Пример #5
0
        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);
        }