コード例 #1
0
        public static double CalcularDistacia(double lat1, double lon1, double lat2, double lon2)
        {
            if (lat1.Equals(lat2) && lon1.Equals(lon2))
            {
                return(0);
            }
            try
            {
                var dirs = GoogleDirections.GetDirections(new LatLon(lat1, lon1), new LatLon(lat2, lon2), GoogleDirections.Modes.Driving, string.Empty);
                if (dirs != null)
                {
                    return(dirs.Distance / 1000.0);
                }

                //var dir1 = GetEsquinaMasCercana(lat1, lon1);
                //var dir2 = GetEsquinaMasCercana(lat2, lon2);
                //if (dir1 != null && dir2 != null)
                //{
                //    var d1 = new Direccion(dir1);
                //    var d2 = new Direccion(dir2);
                //    var reco = new Recorrido(d1, d2);
                //    var dist = reco.Distancia;
                //    if (dist > 0) return dist;
                //}
            }
            catch
            {
            }
            return(Distancias.Loxodromica(lat1, lon1, lat2, lon2) / 1000.0);
        }
コード例 #2
0
ファイル: MobilePoiDAO.cs プロジェクト: jesumarquez/lt
        public IEnumerable <MobilePoi> GetMobileNearPois(IEnumerable <Coche> vehiculos, IEnumerable <int> idsReferenciasgeograficas, double distancia)
        {
            Watch.Start();
            var posicionesDao             = DAOFactory.LogPosicionDAO;
            var mensajesDao               = DAOFactory.LogUltimoLoginDAO;
            var referenciasGeograficasDao = DAOFactory.ReferenciaGeograficaDAO;

            var results = new List <MobilePoi>();

            var currentDrivers = mensajesDao.GetCurrentDrivers(vehiculos);

            foreach (var coche in vehiculos)
            {
                var posicion = posicionesDao.GetLastOnlineVehiclePosition(coche);
                if (posicion == null)
                {
                    continue;
                }

                var idCoche     = coche.Id;
                var referencias = referenciasGeograficasDao.GetGeocercasFor(coche);
                results.AddRange(referencias
                                 .Where(g => Distancias.Loxodromica(posicion.Latitud, posicion.Longitud, g.Latitude, g.Longitude) <= distancia)
                                 .Select(g => new MobilePoi(posicion, g, currentDrivers[idCoche]))
                                 );
            }

            return(results.OrderBy(result => result.PuntoDeInteres).ThenBy(result => result.Distancia).ToList());
        }
コード例 #3
0
ファイル: MobileEventDAO.cs プロジェクト: jesumarquez/lt
        public List <MobileEvent> GetDetenciones(List <int> mobilesIds, DateTime initialDate, DateTime finalDate, int duracion, double radio, double lat, double lon, int maxMonths)
        {
            var results = DAOFactory.LogMensajeDAO.GetByVehiclesAndCode(mobilesIds, MessageCode.StoppedEvent.GetMessageCode(), initialDate, finalDate, maxMonths);

            if (!results.Any())
            {
                return(new List <MobileEvent>());
            }

            return(results.Where(log => Distancias.Loxodromica(lat, lon, log.Latitud, log.Longitud) <= radio && log.FechaFin.Value.Subtract(log.Fecha).TotalMinutes >= duracion)
                   .Select(log => new MobileEvent
            {
                Intern = log.Coche.Interno,
                MobileType = log.Coche.TipoCoche != null ? log.Coche.TipoCoche.Descripcion : "",
                Driver = log.Chofer != null ? log.Chofer.Entidad.Descripcion : "",
                EventTime = log.Fecha.ToDisplayDateTime(),
                Message = log.Texto,
                IdMensaje = log.Mensaje.Id,
                Latitude = log.Latitud,
                Longitude = log.Longitud,
                IconUrl = log.GetIconUrl(),
                EventEndTime = log.FechaFin != null ? log.FechaFin.Value.ToDisplayDateTime() : log.FechaFin,
                FinalLatitude = log.LatitudFin,
                FinalLongitude = log.LongitudFin,
                Id = log.Id,
                Responsable = log.Coche.Chofer != null ? log.Coche.Chofer.Entidad.Descripcion : "",
                TieneFoto = log.TieneFoto,
                IdPuntoInteres = log.IdPuntoDeInteres
            }).ToList());
        }
コード例 #4
0
ファイル: RecorridoAlta.aspx.cs プロジェクト: jesumarquez/lt
        protected override void OnSave()
        {
            EditObject.Empresa = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null;
            EditObject.Linea   = cbLinea.Selected > 0 ? DAOFactory.LineaDAO.FindById(cbLinea.Selected) : null;
            EditObject.Codigo  = txtCodigo.Text.Trim();
            EditObject.Nombre  = txtNombre.Text.Trim();
            EditObject.Desvio  = Convert.ToInt32(txtDesvio.Text.Trim());

            var points = EditLine1.Points.Get();

            EditObject.Detalles.Clear();
            DetalleRecorrido last = null;

            for (int i = 0; i < points.Count; i++)
            {
                var point = points[i];
                var det   = new DetalleRecorrido {
                    Latitud = point.Y, Longitud = point.X, Recorrido = EditObject, Orden = i
                };
                det.Distancia = last == null
                                    ? 0
                                    : Distancias.Loxodromica(last.Latitud, last.Longitud, det.Latitud, det.Longitud) / 1000.0;
                EditObject.Detalles.Add(det);
                last = det;
            }


            DAOFactory.RecorridoDAO.SaveOrUpdate(EditObject);
        }
コード例 #5
0
        public List <MobilePoi> GetVehiculosCercanos(IEnumerable <int> empresas, IEnumerable <int> lineas, int referencia)
        {
            var posDao   = new LogPosicionDAO();
            var cocheDao = new CocheDAO();

            var r = FindById(referencia);

            var lat = r.Direccion != null ? r.Direccion.Latitud : r.Poligono.Centro.Y;
            var lon = r.Direccion != null ? r.Direccion.Longitud : r.Poligono.Centro.X;

            var coches = cocheDao.GetList(empresas, lineas);

            if (!coches.Any())
            {
                return(new List <MobilePoi>());
            }

            return(posDao.GetLastVehiclesPositions(coches).Values
                   .Where(position => position != null)
                   .Select(lup => new MobilePoi
            {
                IdVehiculo = lup.IdCoche,
                PuntoDeInteres = r.Descripcion,
                Distancia = Distancias.Loxodromica(lup.Latitud, lup.Longitud, lat, lon),
                Interno = lup.Coche,
                Latitud = lup.Latitud,
                Longitud = lup.Longitud,
                TipoVehiculo = lup.TipoCoche,
                Velocidad = lup.Velocidad
            })
                   .OrderBy(mp => mp.Distancia)
                   .ToList());
        }
コード例 #6
0
ファイル: Intercalador.cs プロジェクト: jesumarquez/lt
        public void CalcularCostos(PuntoEntrega nuevoPunto, int radio)
        {
            if (Viajes == null)
            {
                throw new ApplicationException("Antes de intercalar hay que cargar los datos con el método Load");
            }

            var cercanos = Viajes.Where(v => v.Detalles.Any(
                                            d => Distancias.Loxodromica(d.ReferenciaGeografica.Latitude,
                                                                        d.ReferenciaGeografica.Longitude,
                                                                        nuevoPunto.ReferenciaGeografica.Latitude,
                                                                        nuevoPunto.ReferenciaGeografica.Longitude) <= radio));

            var result = cercanos.Select(c => CalcularIntercalado(c, nuevoPunto))
                         .OrderBy(i => i.CostoKmExtra);

            var inter = new List <Intercalado>();

            foreach (var intercalado in result)
            {
                var i = CalcularDirections(intercalado, nuevoPunto);
                if (IsInHoras(i))
                {
                    inter.Add(i);
                }
                if (inter.Count > 5)
                {
                    break;
                }
            }
            Intercalados = inter.OrderBy(i => i.CostoKmExtra).ToList();
        }
コード例 #7
0
ファイル: PeriodData.cs プロジェクト: jesumarquez/lt
 private static double GetDistance(LogPosicionBase initialPosition, LogPosicionBase lastPosition)
 {
     if (initialPosition == null || lastPosition == null)
     {
         return(0);
     }
     return(Distancias.Loxodromica(initialPosition.Latitud, initialPosition.Longitud, lastPosition.Latitud, lastPosition.Longitud) / 1000.0);
 }
コード例 #8
0
        public List <MobileTour> GetMobileTour(IEnumerable <int> vehiculos, string codigoInicio, string codigoFin, DateTime inicio, DateTime fin, int radio, bool ocultarHuerfanos)
        {
            var results = GetTourEvents(vehiculos, codigoInicio, codigoFin, inicio, fin);

            var list = new List <MobileTour>(results.Count / 2);

            var        cocheDao = new CocheDAO();
            MobileTour tour     = null;

            foreach (var result in results)
            {
                var distancia = tour != null?Distancias.Loxodromica(tour.LatitudInicio, tour.LongitudInicio, result.Latitud, result.Longitud) : 0;

                var dentro = distancia <= radio;
                if (tour == null || tour.IdMovil != result.Coche.Id || !dentro)
                {
                    if (result.Mensaje.Codigo == codigoInicio)
                    {
                        tour = new MobileTour
                        {
                            Entrada        = result.Fecha.ToDisplayDateTime(),
                            IdMovil        = result.Coche.Id,
                            Interno        = cocheDao.FindById(result.Coche.Id).Interno,
                            LatitudInicio  = result.Latitud,
                            LongitudInicio = result.Longitud
                        };
                        list.Add(tour);
                    }
                    else if (result.Mensaje.Codigo == codigoFin)
                    {
                        tour = new MobileTour
                        {
                            Salida      = result.Fecha.ToDisplayDateTime(),
                            IdMovil     = result.Coche.Id,
                            Interno     = cocheDao.FindById(result.Coche.Id).Interno,
                            LatitudFin  = result.Latitud,
                            LongitudFin = result.Longitud
                        };
                        list.Add(tour);
                    }
                }
                else if (result.Mensaje.Codigo == codigoFin && (tour.IdMovil == result.Coche.Id))
                {
                    tour.Salida      = result.Fecha.ToDisplayDateTime();
                    tour.LatitudFin  = result.Latitud;
                    tour.LongitudFin = result.Longitud;
                }
            }

            if (ocultarHuerfanos)
            {
                list = list.Where(t => t.Entrada != DateTime.MinValue && t.Salida != DateTime.MinValue).ToList();
            }

            return(list);
        }
コード例 #9
0
        /// <summary>
        /// Gets locations with multiple stopped events using the specified filter values.
        /// </summary>
        /// <param name="vehiculos"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <param name="duracion"></param>
        /// <param name="radio"></param>
        /// <param name="topN"></param>
        /// <param name="maxMonths"></param>
        /// <returns></returns>
        public List <MobileStoppedEvent> GetMultipleStoppedEvents(List <int> vehiculos, DateTime desde, DateTime hasta, int duracion, int radio, int topN, int maxMonths)
        {
            var diff = TimeSpan.FromMinutes(duracion);

            var events = DAOFactory.LogMensajeDAO.GetByVehiclesAndCode(vehiculos, MessageCode.StoppedEvent.GetMessageCode(), desde, hasta, maxMonths)
                         .Where(e => e.FechaFin != null && e.Fecha != null)
                         .Select(m => new ModifiedEvent {
                Id = m.Id, Latitud = m.Latitud, Longitud = m.Longitud, Fecha = m.Fecha, FechaFin = m.FechaFin
            })
                         .ToList()
                         .Where(e => e.FechaFin.GetValueOrDefault().Subtract(e.Fecha.GetValueOrDefault()) >= diff)
                         .OrderBy(m => m.Latitud)
                         .ToList();

            var results = new List <MobileStoppedEvent>();

            for (var i = 0; i < events.Count; i++)
            {
                var ev    = events[i];
                var grupo = new List <ModifiedEvent> {
                    ev
                };

                for (var j = i + 1; j < events.Count; j++)
                {
                    var ev2     = events[j];
                    var latDist = Distancias.Loxodromica(ev.Latitud, ev.Longitud, ev2.Latitud, ev.Longitud);
                    if (latDist > radio)
                    {
                        break;
                    }

                    var dist = Distancias.Loxodromica(ev.Latitud, ev.Longitud, ev2.Latitud, ev2.Longitud);
                    if (dist <= radio)
                    {
                        grupo.Add(ev2);
                        events.RemoveAt(j);
                        j--;
                    }
                }

                results.Add(grupo.GroupBy(e => e.DummyProp).Select(e => new MobileStoppedEvent
                {
                    Latitude      = e.Average(a => a.Latitud),
                    Longitude     = e.Average(a => a.Longitud),
                    StoppedEvents = e.Count()
                }).FirstOrDefault());
            }

            return(results.GroupBy(r => r.Corner).Select(r => new MobileStoppedEvent
            {
                Latitude = r.First().Latitude,
                Longitude = r.First().Longitude,
                StoppedEvents = r.Sum(res => res.StoppedEvents)
            }).OrderByDescending(r => r.StoppedEvents).Take(topN).ToList());
        }
コード例 #10
0
ファイル: Intercalador.cs プロジェクト: jesumarquez/lt
        private Intercalado CalcularIntercalado(ViajeDistribucion viaje, PuntoEntrega nuevoPunto)
        {
            var alPunto = viaje.Detalles.Select(e => Distancias.Loxodromica(e.ReferenciaGeografica.Latitude,
                                                                            e.ReferenciaGeografica.Longitude,
                                                                            nuevoPunto.ReferenciaGeografica.Latitude,
                                                                            nuevoPunto.ReferenciaGeografica.Longitude)).ToArray();
            var deViaje = new List <double>();

            for (int i = 1; i < viaje.EntregasTotalCountConBases; i++)
            {
                var e         = viaje.Detalles[i];
                var p         = viaje.Detalles[i - 1];
                var distancia = Distancias.Loxodromica(p.ReferenciaGeografica.Latitude,
                                                       p.ReferenciaGeografica.Longitude,
                                                       e.ReferenciaGeografica.Latitude,
                                                       e.ReferenciaGeografica.Longitude);
                deViaje.Add(distancia);
            }

            var costoTotal = deViaje.Any() ? deViaje.Sum() : 0;

            var menorCosto = double.MaxValue;
            var posicion   = 0;

            for (var i = 0; i <= viaje.EntregasTotalCountConBases; i++)
            {
                var costo = 0.0;
                if (i == 0)
                {
                    costo += costoTotal;
                    costo += alPunto[0];
                }
                else if (i == viaje.EntregasTotalCountConBases)
                {
                    costo += costoTotal;
                    costo += alPunto[viaje.EntregasTotalCountConBases - 1];
                }
                else
                {
                    costo  = costoTotal - deViaje[i - 1];
                    costo += alPunto[i - 1];
                    costo += alPunto[i];
                }

                if (costo < menorCosto)
                {
                    menorCosto = costo;
                    posicion   = i;
                }
            }
            return(new Intercalado {
                Id = viaje.Id, Index = posicion, CostoKm = menorCosto, CostoKmOld = costoTotal
            });
        }
コード例 #11
0
ファイル: MobilePoiHistoric.cs プロジェクト: jesumarquez/lt
 public MobilePoiHistoric(LogPosicionBase posicion, ReferenciaGeografica referencia, DateTime fecha)
 {
     Interno        = posicion.Coche.Interno;
     TipoVehiculo   = posicion.Coche.TipoCoche.Descripcion;
     Distancia      = Distancias.Loxodromica(posicion.Latitud, posicion.Longitud, referencia.Latitude, referencia.Longitude);
     Latitud        = posicion.Latitud;
     Longitud       = posicion.Longitud;
     PuntoDeInteres = referencia.Descripcion;
     Velocidad      = posicion.Velocidad;
     Responsable    = posicion.Coche.Chofer != null ? posicion.Coche.Chofer.Entidad.Descripcion : string.Empty;
     Fecha          = fecha;
     RefId          = referencia.Id;
 }
コード例 #12
0
ファイル: MobilePoi.cs プロジェクト: jesumarquez/lt
 public MobilePoi(LogUltimaPosicionVo posicion, Geocerca referencia, Empleado chofer)
 {
     IdVehiculo     = posicion.IdCoche;
     Interno        = posicion.Coche;
     TipoVehiculo   = posicion.TipoCoche;
     Distancia      = Distancias.Loxodromica(posicion.Latitud, posicion.Longitud, referencia.Latitude, referencia.Longitude);
     Latitud        = posicion.Latitud;
     Longitud       = posicion.Longitud;
     PuntoDeInteres = referencia.Descripcion;
     Velocidad      = posicion.Velocidad;
     Responsable    = posicion.Responsable;
     Chofer         = chofer != null ? chofer.Entidad.Descripcion : string.Empty;
 }
コード例 #13
0
        /// <summary>
        /// Searchs result positions to be displayed.
        /// </summary>

        /*private void SearchPositions()
         * {
         *  var route = DAOFactory.RoutePositionDAO.GetPositions(Mobile, InitialDate.ToDataBaseDateTime(), FinalDate.ToDataBaseDateTime());
         *
         *  if (route.Count == 0)
         *  {
         *      ShowInfo("No se encontraron posiciones para los parametros de busqueda ingresados!");
         *
         *      return;
         *  }
         *
         *  var pos = "[";
         *
         *  for (var i = 0; i < route.Count; i++)
         *  {
         *      var dist = i == route.Count - 1 ? 0 : Distancias.Loxodromica(route[i].Latitude, route[i].Longitude, route[i + 1].Latitude, route[i + 1].Longitude);
         *
         *      var duration = i == route.Count - 1 ? 0 : route[i + 1].Date.Subtract(route[i].Date).TotalSeconds;
         *
         *      if (i > 0) pos = string.Concat(pos, ',');
         *
         *      pos = string.Concat(pos, string.Format("{{lon: {0}, lat: {1}, speed: {2}, distance: {3}, duration: {4}, time: new Date{5}}}",
         *          route[i].Longitude.ToString(CultureInfo.InvariantCulture), route[i].Latitude.ToString(CultureInfo.InvariantCulture), route[i].Speed,
         *          dist.ToString(CultureInfo.InvariantCulture), duration.ToString(CultureInfo.InvariantCulture), route[i].Date.ToString("(yyyy, MM, dd, HH, mm, ss)")));
         *  }
         *
         *  pos = string.Concat(pos, "]");
         *
         *  System.Web.UI.ScriptManager.RegisterStartupScript(this, typeof(string), "route", string.Format("simulador.createRoute({0});", pos), true);
         * }
         */
        private void SearchPositions()
        {
            var colorGenerator = new ColorGenerator(new List <Color> {
                Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Violet, Color.Cyan, Color.Purple
            });
            var empresa   = DAOFactory.EmpresaDAO.FindById(ddlDistrito.Selected);
            var maxMonths = empresa != null && empresa.Id > 0 ? empresa.MesesConsultaPosiciones : 3;

            var route = DAOFactory.RoutePositionsDAO.GetPositionsByRoute(Mobile, InitialDate.ToDataBaseDateTime(), FinalDate.ToDataBaseDateTime(), TimeSpan.Zero, maxMonths);

            if (route.Count == 0)
            {
                ShowInfo("No se encontraron posiciones para los parametros de busqueda ingresados!");

                return;
            }

            var pos = "[";

            for (var j = 0; j < route.Count; j++)
            {
                var tramo = route[j];
                var color = HexColorUtil.ColorToHex(colorGenerator.GetNextColor(j)).Substring(1);
                color = color.Substring(4, 2) + color.Substring(2, 2) + color.Substring(0, 2);
                for (var i = 0; i < tramo.Count; i++)
                {
                    var posicion = tramo[i];
                    var next     = i == tramo.Count - 1
                                   ? j == route.Count - 1 ? null : route[j + 1][0]
                                   : tramo[i + 1];
                    var dist = next == null ? 0 : Distancias.Loxodromica(posicion.Latitude, posicion.Longitude, next.Latitude, next.Longitude);

                    var duration = next == null ? 0 : next.Date.Subtract(posicion.Date).TotalSeconds;

                    if (j > 0 || i > 0)
                    {
                        pos = string.Concat(pos, ',');
                    }

                    pos = string.Concat(pos, string.Format("{{lon: {0}, lat: {1}, speed: {2}, distance: {3}, duration: {4}, time: new Date{5}, 'color': '{6}' }}",
                                                           posicion.Longitude.ToString(CultureInfo.InvariantCulture), posicion.Latitude.ToString(CultureInfo.InvariantCulture), posicion.Speed,
                                                           dist.ToString(CultureInfo.InvariantCulture), duration.ToString(CultureInfo.InvariantCulture), posicion.Date.ToDisplayDateTime().ToString("(yyyy, MM, dd, HH, mm, ss)"), color));
                }
            }
            pos = string.Concat(pos, "]");

            var startflag = CreateAbsolutePath("~/images/salida.png");
            var endflag   = CreateAbsolutePath("~/images/llegada.png");

            System.Web.UI.ScriptManager.RegisterStartupScript(this, typeof(string), "route", string.Format("simulador.createRoute({0},'{1}','{2}');", pos, startflag, endflag), true);
        }
コード例 #14
0
ファイル: PeriodData.cs プロジェクト: jesumarquez/lt
        private bool EsPosicionValida(LogPosicionBase a, LogPosicionBase b)
        {
            if (a == null || b == null)
            {
                return(true);
            }

            //Calculo el tiempo entre posiciones, la distancia y la maxima distancia alcanzable por el movil en ese intervalo de tiempo.
            var tiempo    = Math.Abs(b.FechaMensaje.Subtract(a.FechaMensaje).TotalSeconds);
            var distancia = Math.Abs(Distancias.Loxodromica(a.Latitud, a.Longitud, b.Latitud, b.Longitud));
            var maximaDistanciaTipoVehiculo = (Vehiculo.TipoCoche.MaximaVelocidadAlcanzable * tiempo) / 3.6;

            return(distancia <= maximaDistanciaTipoVehiculo);
        }
コード例 #15
0
ファイル: MobilePoiDAO.cs プロジェクト: jesumarquez/lt
        /// <summary>
        /// Gets mobiles near the specified point
        /// </summary>
        /// <param name="coches"></param>
        /// <param name="latitud"></param>
        /// <param name="longitud"></param>
        /// <param name="distancia"></param>
        /// <returns></returns>
        public List <MobilePoi> GetMobilesNearPoint(IEnumerable <Coche> coches, double latitud, double longitud, double distancia)
        {
            var lastPositions = DAOFactory.LogPosicionDAO.GetLastVehiclesPositions(coches);

            return((from position in lastPositions.Values where position != null &&
                    Distancias.Loxodromica(position.Latitud, position.Longitud, latitud, longitud) <= distancia
                    select new MobilePoi
            {
                IdVehiculo = position.IdCoche,
                TipoVehiculo = position.TipoCoche,
                Interno = position.Coche,
                Distancia = Distancias.Loxodromica(position.Latitud, position.Longitud, latitud, longitud),
                Latitud = position.Latitud,
                Longitud = position.Longitud
            }
                    ).OrderBy(position => position.Distancia).ToList());
        }
コード例 #16
0
        public static ViajeDistribucion CalcularHorario(this ViajeDistribucion distribucion, int index, Directions directions)
        {
            if (index < 0 || index >= distribucion.Detalles.Count || distribucion.Detalles.Count <= 1)
            {
                return(distribucion);
            }

            var entregas = distribucion.Detalles;

            var previo  = entregas[index == 0 ? 0 : index - 1];
            var entrega = entregas[index == 0 ? 1 : index];

            TimeSpan tiempoViaje;

            if (directions == null)
            {
                // si no tengo el recorrido hago distancia x velocidad promedio
                var distancia = Distancias.Loxodromica(previo.PuntoEntrega.ReferenciaGeografica.Latitude,
                                                       previo.PuntoEntrega.ReferenciaGeografica.Longitude,
                                                       entrega.PuntoEntrega.ReferenciaGeografica.Latitude,
                                                       entrega.PuntoEntrega.ReferenciaGeografica.Longitude);
                var velocidad = distribucion.GetVelocidadPromedio();

                tiempoViaje = TimeSpan.FromHours(distancia / velocidad);
            }
            else
            {
                // si tengo el recorrido tomo la duración
                tiempoViaje = directions.Legs[index == 0 ? 0 : index - 1].Duration;
            }
            if (index == 0)
            {
                previo.Programado = entrega.Programado;
            }
            entrega.Programado = previo.Programado.Add(tiempoViaje);

            // muevo todos las entregas posteriores
            for (var i = index; i < entregas.Count; i++)
            {
                entregas[i].Programado = entregas[i].Programado.Add(tiempoViaje);
            }

            return(distribucion);
        }
コード例 #17
0
        protected void VehiculosCercanos(Coche vehiculo, LogUltimaPosicionVo posicion)
        {
            var vehiculos = DAOFactory.CocheDAO.GetList(IdsEmpresas, IdsLineas)
                            .Where(v => v.Dispositivo != null)
                            .ToList();
            var positions = SharedPositions.GetLastPositions(vehiculos);

            var distancias = from pos in positions
                             where pos.IdCoche != vehiculo.Id
                             select new VehiculoDistancia
            {
                Distancia = Distancias.Loxodromica(posicion.Latitud, posicion.Longitud, pos.Latitud, pos.Longitud),
                Id        = pos.IdCoche, Interno = pos.Coche
            };
            var cercanas = (from pos in distancias orderby pos.Distancia select pos).Take(5);

            gridMov.DataSource = cercanas;
            gridMov.DataBind();
        }
コード例 #18
0
        /// <summary>
        /// Determines if the geo reference contains the givenn point.
        /// </summary>
        /// <param name="pt"></param>
        /// <returns></returns>
        private bool Contains(PointF pt)
        {
            var isIn = false;

            if (!HasPoligono)
            {
                return(false);
            }

            if (IsInBounds(pt))
            {
                if (Radio > 0)
                {
                    if (IsInInnerBounds(pt))
                    {
                        return(true);
                    }

                    var distancia = Distancias.Loxodromica(Puntos[0].Y, Puntos[0].X, pt.Y, pt.X);

                    isIn = distancia <= Radio;
                }
                else
                {
                    var pts = Puntos;

                    int i, j;

                    for (i = 0, j = pts.Count - 1; i < pts.Count; j = i++)
                    {
                        if ((((pts[i].Y <= pt.Y) && (pt.Y < pts[j].Y)) || ((pts[j].Y <= pt.Y) && (pt.Y < pts[i].Y))) &&
                            (pt.X < (pts[j].X - pts[i].X) * (pt.Y - pts[i].Y) / (pts[j].Y - pts[i].Y) + pts[i].X))
                        {
                            isIn = !isIn;
                        }
                    }
                }
            }

            return(isIn);
        }
コード例 #19
0
ファイル: PeriodData.cs プロジェクト: jesumarquez/lt
        public double GetDistancia(LogPosicionBase inicio, LogPosicionBase fin, DateTime?desde, DateTime?hasta)
        {
            if (inicio == null || fin == null)
            {
                return(0);
            }
            var totalDistance = Distancias.Loxodromica(inicio.Latitud, inicio.Longitud, fin.Latitud, fin.Longitud) / 1000.0;

            if (!desde.HasValue && !hasta.HasValue)
            {
                return(totalDistance);
            }

            var fDesde = desde.HasValue ? desde.Value : inicio.FechaMensaje;
            var fHasta = hasta.HasValue ? hasta.Value : fin.FechaMensaje;

            var totalTime   = fin.FechaMensaje.Subtract(inicio.FechaMensaje).TotalMinutes;
            var partialTime = fHasta.Subtract(fDesde).TotalMinutes;

            return(totalTime > 0 ? (totalDistance * partialTime) / totalTime : 0);
        }
コード例 #20
0
ファイル: CocheDAO.cs プロジェクト: jesumarquez/lt
        /// <summary>
        /// Gets the distance traveled by the mobile in the specified time span.
        /// </summary>
        /// <param name="coche"></param>
        /// <param name="inicio"></param>
        /// <param name="fin"></param>
        /// <returns></returns>
        public double GetDistance(int coche, DateTime inicio, DateTime fin)
        {
            var distance = 0.0;

            if (fin < DateTime.Today.ToDataBaseDateTime())
            {
                var dmDAO = new DatamartDAO();
                var dm    = dmDAO.GetMobilesKilometers(inicio, fin, new List <int> {
                    coche
                }).FirstOrDefault();
                return(dm != null ? dm.Kilometers : 0.0);
            }

            //var sqlQ = Session.CreateSQLQuery("SELECT dbo.fn_getVehicleKm(?, ?, ?);");
            //sqlQ.SetInt32(0, coche);
            //sqlQ.SetDateTime(1, inicio);
            //sqlQ.SetDateTime(2, fin);
            //distance = sqlQ.UniqueResult<double>();
            //return distance;

            var lpDAO   = new LogPosicionDAO();
            var results = lpDAO.GetPositionsBetweenDates(coche, inicio, fin);

            //if (results.Count.Equals(0))
            //    results = Session.Query<LogPosicionHistorica>()
            //        .Where(position => position.Coche.Id == coche && position.FechaMensaje >= inicio && position.FechaMensaje <= fin)
            //        .Cast<LogPosicionBase>()
            //        .ToList();

            for (var i = 0; i < results.Count - 1; i++)
            {
                var x = results[i];
                var y = results[i + 1];

                distance += Distancias.Loxodromica(x.Latitud, x.Longitud, y.Latitud, y.Longitud);
            }

            return(distance / 1000.0);
        }
コード例 #21
0
ファイル: Poligono.cs プロジェクト: jesumarquez/lt
        /// <summary>
        /// Compares the supplied point and determines whether or not it is inside the Actual Bounds
        /// of the Polygon.
        /// </summary>
        /// <remarks>The calculation formula was converted from the C version available at
        /// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
        /// </remarks>
        /// <param name="pt">The PointF to compare.</param>
        /// <returns>True if the PointF is within the Actual Bounds, False if it is not.</returns>
        public virtual bool Contains(PointF pt)
        {
            var isIn = false;

            if (IsInBounds(pt))
            {
                if (Radio > 0)
                {
                    if (IsInInnerBounds(pt))
                    {
                        return(true);
                    }

                    var distancia = Distancias.Loxodromica(FirstPoint.Y, FirstPoint.X, pt.Y, pt.X);

                    isIn = distancia <= Radio;
                }
                else
                {
                    var pts = ToPointFList();

                    int i, j;

                    // The following code is converted from a C version found at
                    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
                    for (i = 0, j = pts.Count - 1; i < pts.Count; j = i++)
                    {
                        if ((((pts[i].Y <= pt.Y) && (pt.Y < pts[j].Y)) || ((pts[j].Y <= pt.Y) && (pt.Y < pts[i].Y))) &&
                            (pt.X < (pts[j].X - pts[i].X) * (pt.Y - pts[i].Y) / (pts[j].Y - pts[i].Y) + pts[i].X))
                        {
                            isIn = !isIn;
                        }
                    }
                }
            }

            return(isIn);
        }
コード例 #22
0
            private void RecalculateTimes(ViajeDistribucion distribucion)
            {
                var firstDetalle = Detalles.First();
                var lastDetalle  = Detalles.Last();

                var totalTime = lastDetalle.Programado.Subtract(firstDetalle.Programado).TotalMinutes;

                if (totalTime == 0)
                {
                    lastDetalle = null;
                    foreach (var detalle in Detalles)
                    {
                        if (lastDetalle != null)
                        {
                            var distancia = Distancias.Loxodromica(lastDetalle.Latitud, lastDetalle.Longitud, detalle.Latitud, detalle.Longitud) / 1000;
                            var velocidad = distribucion.Vehiculo.VelocidadPromedio > 0 ? distribucion.Vehiculo.VelocidadPromedio: distribucion.Vehiculo.TipoCoche.VelocidadPromedio > 0?distribucion.Vehiculo.TipoCoche.VelocidadPromedio:40;
                            var tiempo    = TimeSpan.FromHours(distancia / velocidad);
                            detalle.Programado = lastDetalle.Programado.Add(tiempo) + TimeSpan.FromMinutes(10);
                        }
                        lastDetalle = detalle;
                    }
                }
            }
コード例 #23
0
        public IEnumerable <MobilePoiHistoric> GetMobileNearPois(IEnumerable <Coche> vehiculos, int idGeoRef, double distancia, DateTime desde, DateTime hasta)
        {
            var posicionesDao = DAOFactory.LogPosicionDAO;
            //var posicionesHistoricasDao = DAOFactory.LogPosicionHistoricaDAO;
            var mensajesDao = DAOFactory.LogMensajeDAO;
            var referenciasGeograficasDao = DAOFactory.ReferenciaGeograficaDAO;

            var results = new List <MobilePoiHistoric>();

            var referencia = referenciasGeograficasDao.FindById(idGeoRef);

            foreach (var vehicle in vehiculos)
            {
                // Si no son de la misma Empresa / Linea no los comparo.
                if (vehicle.Empresa != null && referencia.Empresa != null)
                {
                    if (vehicle.Empresa.Id != referencia.Empresa.Id)
                    {
                        continue;
                    }
                    if (vehicle.Linea != null && referencia.Linea != null)
                    {
                        if (vehicle.Linea.Id != referencia.Linea.Id)
                        {
                            continue;
                        }
                    }
                }

                var maxMonths = vehicle.Empresa != null ? vehicle.Empresa.MesesConsultaPosiciones : 3;

                var positions = posicionesDao.GetPositionsBetweenDates(vehicle.Id, desde, hasta, maxMonths);

                MobilePoiHistoric mobilePoi = null;

                if (positions.Count().Equals(0))
                {
                    //var positionsHist = posicionesHistoricasDao.GetPositionsBetweenDates(vehicle.Id, desde, hasta);

                    //if (positionsHist.Count <= 0) continue;

                    //mobilePoi = positionsHist.Where(pos => Distancias.Loxodromica(pos.Latitud, pos.Longitud, referencia.Latitude, referencia.Longitude) <=
                    //    distancia).Select(pos => new MobilePoiHistoric(pos, referencia, pos.FechaMensaje.ToDisplayDateTime())).OrderBy(pos => pos.Distancia).FirstOrDefault();
                }
                else
                {
                    mobilePoi = positions.Where(pos => Distancias.Loxodromica(pos.Latitud, pos.Longitud, referencia.Latitude, referencia.Longitude) <= distancia)
                                .Select(pos => new MobilePoiHistoric(pos, referencia, pos.FechaMensaje.ToDisplayDateTime())).OrderBy(pos => pos.Distancia).FirstOrDefault();
                }

                if (mobilePoi == null)
                {
                    continue;
                }

                var mensaje = mensajesDao.GetLastVehicleRfidEvent(vehicle.Id, mobilePoi.Fecha);

                mobilePoi.Chofer = mensaje != null ? mensaje.Chofer.Entidad.Descripcion : null;
                results.Add(mobilePoi);
            }

            return(results.Count > 0 ? results.OrderBy(result => result.PuntoDeInteres).ThenBy(result => result.Distancia).ToList() : results);
        }
コード例 #24
0
        private void ProcessDistribucionPorGps(ViajeDistribucion distribucion)
        {
            var entregas = distribucion.Detalles;

            var mensajes = new List <string> {
                MessageCode.EstadoLogisticoCumplidoManual.GetMessageCode(),
                MessageCode.EstadoLogisticoCumplidoManualNoRealizado.GetMessageCode(),
                MessageCode.EstadoLogisticoCumplidoManualRealizado.GetMessageCode()
            };
            var confirmaciones = DaoFactory.MensajeDAO.GetMensajesDeConfirmacion(new[] { distribucion.Empresa.Id }, new int[] { }).Select(m => m.Codigo);
            var rechazos       = DaoFactory.MensajeDAO.GetMensajesDeRechazo(new[] { distribucion.Empresa.Id }, new int[] { }).Select(m => m.Codigo);

            mensajes.AddRange(confirmaciones);
            mensajes.AddRange(rechazos);

            EntregaDistribucion anterior = null;

            if (distribucion.Tipo == ViajeDistribucion.Tipos.Desordenado)
            {
                entregas = distribucion.GetEntregasPorOrdenReal();
            }

            var orden = 0;

            foreach (var entrega in entregas)
            {
                var te = new TimeElapsed();
                var tiempoRecorrido = new TimeSpan(0);
                var kms             = 0.0;
                if (anterior != null &&
                    (entrega.Estado.Equals(EntregaDistribucion.Estados.Completado) ||
                     entrega.Estado.Equals(EntregaDistribucion.Estados.Visitado)))
                {
                    if (entrega.EntradaOManualExclusiva.HasValue && anterior.SalidaOManualExclusiva.HasValue)
                    {
                        tiempoRecorrido = entrega.EntradaOManualExclusiva.Value.Subtract(anterior.SalidaOManualExclusiva.Value);
                        if (tiempoRecorrido.TotalMinutes < 0)
                        {
                            tiempoRecorrido = new TimeSpan(0);
                        }
                    }

                    if (entrega.Viaje.Vehiculo != null && anterior.FechaMin < entrega.FechaMin && entrega.FechaMin < DateTime.MaxValue)
                    {
                        var dm = DaoFactory.DatamartDAO.GetMobilesKilometers(anterior.FechaMin, entrega.FechaMin, new List <int> {
                            entrega.Viaje.Vehiculo.Id
                        }).FirstOrDefault();
                        kms = dm != null ? dm.Kilometers : 0.0;
                        //kms = DaoFactory.CocheDAO.GetDistance(entrega.Viaje.Vehiculo.Id, anterior.FechaMin, entrega.FechaMin);
                    }
                }

                var tiempoEntrega = entrega.Salida.HasValue && entrega.Entrada.HasValue
                                        ? entrega.Salida.Value.Subtract(entrega.Entrada.Value)
                                        : new TimeSpan();
                var desvio = entrega.Entrada.HasValue
                                ? entrega.Entrada.Value.Subtract(entrega.Programado)
                                : new TimeSpan();

                var eventos   = entrega.EventosDistri.Where(e => mensajes.Contains(e.LogMensaje.Mensaje.Codigo));
                var evento    = eventos.Any() ? eventos.OrderBy(e => e.Fecha).FirstOrDefault() : null;
                var distancia = evento != null?Distancias.Loxodromica(evento.LogMensaje.Latitud, evento.LogMensaje.Longitud, entrega.ReferenciaGeografica.Latitude, entrega.ReferenciaGeografica.Longitude) : (double?)null;

                var registro = new DatamartDistribucion
                {
                    Empresa        = entrega.Viaje.Empresa,
                    Linea          = entrega.Linea,
                    Vehiculo       = entrega.Viaje.Vehiculo,
                    CentroDeCostos = entrega.Viaje.CentroDeCostos,
                    Viaje          = entrega.Viaje,
                    Detalle        = entrega,
                    Fecha          = entrega.Viaje.Inicio,
                    Ruta           = entrega.Viaje.Codigo.Trim(),
                    Entrega        = entrega.Descripcion.Trim().Length > 50 ? entrega.Descripcion.Trim().Substring(0, 50) : entrega.Descripcion.Trim(),
                    IdEstado       = entrega.Estado,
                    Estado         = CultureManager.GetLabel(EntregaDistribucion.Estados.GetLabelVariableName(entrega.Estado)),
                    Km             = kms,
                    Recorrido      = tiempoRecorrido.TotalMinutes,
                    TiempoEntrega  = tiempoEntrega.TotalSeconds > 0 ? tiempoEntrega.TotalMinutes : 0.0,
                    Entrada        = entrega.Entrada,
                    Salida         = entrega.Salida,
                    Manual         = entrega.Manual,
                    Programado     = entrega.Programado,
                    Desvio         = desvio.TotalMinutes,
                    Orden          = orden,
                    Importe        = 0.0f,
                    PuntoEntrega   = entrega.PuntoEntrega,
                    Confirmacion   = entrega.MensajeConfirmacion != null
                                                        ? entrega.MensajeConfirmacion.Mensaje.Descripcion
                                                        : string.Empty,
                    Cliente = entrega.PuntoEntrega != null && entrega.PuntoEntrega.Cliente != null
                                                    ? entrega.PuntoEntrega.Cliente.Descripcion : string.Empty,
                    Distancia = distancia
                };

                DaoFactory.DatamartDistribucionDAO.Save(registro);

                orden++;

                if (entrega.Estado.Equals(EntregaDistribucion.Estados.Completado) ||
                    entrega.Estado.Equals(EntregaDistribucion.Estados.Visitado))
                {
                    anterior = entrega;
                }
            }
        }
コード例 #25
0
ファイル: RouteEventDAO.cs プロジェクト: jesumarquez/lt
        /// <summary>
        /// Method for getting a list of route events for a mobile
        /// within a givenn date span.
        /// </summary>
        /// <param name="mobileId">The mobile id.</param>
        /// <param name="initialDate">The initial date.</param>
        /// <param name="finalDate">The final date.</param>
        /// <param name="noReportTime">Time to be considered as no report interval. In minutes.</param>
        /// <returns>A list of route events.</returns>
        public List <RouteEvent> GetRouteEvents(int mobileId, DateTime initialDate, DateTime finalDate, int noReportTime)
        {
            var results = new List <RouteEvent>();

            var vehicle   = DAOFactory.CocheDAO.FindById(mobileId);
            var maxMonths = vehicle != null && vehicle.Empresa != null ? vehicle.Empresa.MesesConsultaPosiciones : 3;

            var posiciones = DAOFactory.LogPosicionDAO.GetPositionsBetweenDates(mobileId, initialDate, finalDate, maxMonths).OfType <LogPosicionBase>().ToList();

            //if (posiciones.Count.Equals(0))
            //    posiciones = DAOFactory.LogPosicionHistoricaDAO.GetPositionsBetweenDates(mobileId, initialDate, finalDate).OfType<LogPosicionBase>().ToList();

            if (posiciones.Count.Equals(0))
            {
                return(results);
            }

            posiciones.OrderBy(pos => pos.FechaMensaje);

            if (posiciones.Count <= 1)
            {
                return(results);
            }

            var iniDate              = posiciones.First().FechaMensaje;
            var finDate              = posiciones.First().FechaMensaje;
            var finLat               = posiciones.First().Latitud;
            var finLon               = posiciones.First().Longitud;
            var iniLat               = finLat;
            var iniLon               = finLon;
            var distance             = 0.0;
            var direction            = CardinalDirection(iniLat, iniLon, finLat, finLon);
            var directionDescription = string.Empty;
            var velocidades          = new List <int> {
                posiciones.First().Velocidad
            };
            var inDetention = false;

            posiciones.Remove(posiciones.First());

            foreach (var pos in posiciones)
            {
                var actDirection = CardinalDirection(finLat, finLon, pos.Latitud, pos.Longitud);

                directionDescription = CardinalDirectionDescription(direction);

                var actDirectionDescription = CardinalDirectionDescription(actDirection);

                var noReport = (pos.FechaMensaje.Subtract(finDate).TotalMinutes > noReportTime);

                if (noReport ||
                    (velocidades.Max() > 0 && (pos.Velocidad == 0 || (directionDescription != string.Empty &&
                                                                      actDirectionDescription != string.Empty && directionDescription != actDirectionDescription))) ||
                    (velocidades.Max().Equals(0) && (pos.Velocidad > 0 && (iniDate != finDate || pos.FechaMensaje != finDate))))
                {
                    if (pos.Velocidad == 0)
                    {
                        distance = distance + Distancias.Loxodromica(finLat, finLon, pos.Latitud, pos.Longitud) / 1000;

                        finLat      = pos.Latitud;
                        finLon      = pos.Longitud;
                        finDate     = pos.FechaMensaje;
                        inDetention = true;
                    }
                    else
                    {
                        if (inDetention)
                        {
                            finDate = pos.FechaMensaje;
                        }

                        inDetention = false;
                    }

                    results.Add(new RouteEvent
                    {
                        InitialDate      = iniDate,
                        FinalDate        = finDate,
                        MinimumSpeed     = velocidades.Min(),
                        MaximumSpeed     = velocidades.Max(),
                        AverageSpeed     = velocidades.Average(),
                        Direction        = direction,
                        State            = velocidades.Max() > 0 ? "EN MOVIMIENTO - " + directionDescription : "DETENIDO",
                        Distance         = distance,
                        InitialLatitude  = iniLat,
                        InitialLongitude = iniLon,
                        FinalLatitude    = finLat,
                        FinalLongitude   = finLon
                    });

                    velocidades.Clear();

                    distance = 0.0;
                    iniLat   = noReport ? pos.Latitud : finLat;
                    iniLon   = noReport ? pos.Longitud : finLon;
                    iniDate  = noReport ? pos.FechaMensaje : finDate;
                }

                distance = distance + Distancias.Loxodromica(finLat, finLon, pos.Latitud, pos.Longitud) / 1000;

                finDate = pos.FechaMensaje;
                finLat  = pos.Latitud;
                finLon  = pos.Longitud;

                direction = CardinalDirection(iniLat, iniLon, finLat, finLon);

                velocidades.Add(pos.Velocidad);
            }

            results.Add(new RouteEvent
            {
                InitialDate      = iniDate,
                FinalDate        = posiciones.Last().FechaMensaje,
                MinimumSpeed     = velocidades.Min(),
                MaximumSpeed     = velocidades.Max(),
                AverageSpeed     = velocidades.Average(),
                Direction        = direction,
                State            = velocidades.Max() > 0 ? "EN MOVIMIENTO - " + directionDescription : "DETENIDO",
                Distance         = distance,
                InitialLatitude  = iniLat,
                InitialLongitude = iniLon,
                FinalLatitude    = posiciones.Last().Latitud,
                FinalLongitude   = posiciones.Last().Longitud
            });

            return(results);
        }
コード例 #26
0
        public ReporteDistribucionVo(EntregaDistribucion entrega, EntregaDistribucion anterior, int orden, double km, bool verConfirmacion)
        {
            var dao = new DAOFactory();

            Id            = entrega.Viaje.Id;
            Descripcion   = entrega.Descripcion;
            IdDispositivo = entrega.Viaje.Vehiculo != null && entrega.Viaje.Vehiculo.Dispositivo != null
                                ? entrega.Viaje.Vehiculo.Dispositivo.Id
                                : 0;
            Ruta         = entrega.Viaje.Codigo;
            TipoVehiculo = entrega.Viaje.Vehiculo != null && entrega.Viaje.Vehiculo.TipoCoche != null
                               ? entrega.Viaje.Vehiculo.TipoCoche.Descripcion
                               : string.Empty;
            Vehiculo = entrega.Viaje.Vehiculo != null ? entrega.Viaje.Vehiculo.Interno : string.Empty;
            Empleado = entrega.Viaje.Empleado != null && entrega.Viaje.Empleado.Entidad != null
                           ? entrega.Viaje.Empleado.Entidad.Descripcion
                           : string.Empty;
            Fecha        = entrega.Viaje.Inicio.ToDisplayDateTime().ToString("dd/MM/yyyy");
            Orden        = entrega.Orden;
            OrdenReal    = orden;
            PuntoEntrega = entrega.PuntoEntrega != null
                               ? entrega.PuntoEntrega.Descripcion
                               : entrega.ReferenciaGeografica != null
                                     ? entrega.ReferenciaGeografica.Descripcion
                                     : string.Empty;
            Manual = entrega.Manual.HasValue
                         ? entrega.Manual.Value.ToDisplayDateTime().ToString("HH:mm")
                         : string.Empty;
            Entrada = entrega.Entrada.HasValue
                          ? entrega.Entrada.Value.ToDisplayDateTime().ToString("HH:mm")
                          : string.Empty;
            Salida = entrega.Salida.HasValue
                         ? entrega.Salida.Value.ToDisplayDateTime().ToString("HH:mm")
                         : string.Empty;
            var diferencia = entrega.Manual.HasValue && entrega.Salida.HasValue
                   ? entrega.Salida.Value.Subtract(entrega.Manual.Value)
                   : new TimeSpan(0);

            if (diferencia.Ticks != 0)
            {
                if (diferencia.TotalSeconds > 0)
                {
                    Diferencia = diferencia.Hours.ToString("00") + ":" + diferencia.Minutes.ToString("00") + ":" + diferencia.Seconds.ToString("00");
                }
                else
                {
                    diferencia = new TimeSpan(-diferencia.Ticks);
                    Diferencia = "- " + diferencia.Hours.ToString("00") + ":" + diferencia.Minutes.ToString("00") + ":" + diferencia.Seconds.ToString("00");
                }
            }

            var duracion = entrega.Entrada.HasValue && entrega.Salida.HasValue
                               ? entrega.Salida.Value.Subtract(entrega.Entrada.Value)
                               : new TimeSpan(0);

            Duracion = duracion.TotalSeconds > 0
                           ? duracion.Hours.ToString("00") + ":" + duracion.Minutes.ToString("00") + ":" + duracion.Seconds.ToString("00")
                           : string.Empty;
            Estado         = CultureManager.GetLabel(EntregaDistribucion.Estados.GetLabelVariableName(entrega.Estado));
            Km             = km;
            UnreadInactive = entrega.GarminUnreadInactiveAt.HasValue
                                ? entrega.GarminUnreadInactiveAt.Value.ToDisplayDateTime().ToString("HH:mm")
                                : string.Empty;
            ReadInactive = entrega.GarminReadInactiveAt.HasValue
                                ? entrega.GarminReadInactiveAt.Value.ToDisplayDateTime().ToString("HH:mm")
                                : string.Empty;

            var reportDao = new ReportFactory(dao);

            if (entrega.Manual.HasValue && entrega.Viaje.Vehiculo != null)
            {
                Hasta = entrega.Manual.Value;
                if (anterior != null)
                {
                    if (anterior.Manual.HasValue)
                    {
                        Desde = anterior.Manual.Value;
                    }
                    else if (anterior.Salida.HasValue)
                    {
                        Desde = anterior.Salida.Value;
                    }
                    else
                    {
                        Desde = anterior.Programado;
                    }

                    var maxMonths = entrega.Viaje.Vehiculo.Empresa != null ? entrega.Viaje.Vehiculo.Empresa.MesesConsultaPosiciones : 3;
                    var eventos   = reportDao.MobileEventDAO.GetMobilesEvents(new List <int> {
                        entrega.Viaje.Vehiculo.Id
                    },
                                                                              new[] { 514 },
                                                                              new List <int> {
                        0
                    },
                                                                              Desde,
                                                                              Hasta,
                                                                              maxMonths);

                    TieneFoto = eventos.Any();
                }
            }

            if (verConfirmacion && entrega.Viaje.Vehiculo != null)
            {
                var mensajes = new List <string> {
                    MessageCode.EstadoLogisticoCumplidoManual.GetMessageCode(),
                    MessageCode.EstadoLogisticoCumplidoManualNoRealizado.GetMessageCode(),
                    MessageCode.EstadoLogisticoCumplidoManualRealizado.GetMessageCode()
                };
                var confirmaciones = dao.MensajeDAO.GetMensajesDeConfirmacion(new[] { entrega.Viaje.Empresa.Id }, new int[] {}).Select(m => m.Codigo);
                var rechazos       = dao.MensajeDAO.GetMensajesDeRechazo(new[] { entrega.Viaje.Empresa.Id }, new int[] {}).Select(m => m.Codigo);
                mensajes.AddRange(confirmaciones);
                mensajes.AddRange(rechazos);

                Confirmacion = entrega.MensajeConfirmacion != null
                                    ? entrega.MensajeConfirmacion.Mensaje.Descripcion
                                    : string.Empty;
                Horario = entrega.RecepcionConfirmacion.HasValue
                              ? entrega.RecepcionConfirmacion.Value.ToDisplayDateTime()
                              : (DateTime?)null;
                var eventos = entrega.EventosDistri.Where(e => mensajes.Contains(e.LogMensaje.Mensaje.Codigo));
                var evento  = eventos.Any()
                                ? eventos.OrderBy(e => e.Fecha).FirstOrDefault()
                                : null;

                Distancia = evento != null?Distancias.Loxodromica(evento.LogMensaje.Latitud, evento.LogMensaje.Longitud, entrega.ReferenciaGeografica.Latitude, entrega.ReferenciaGeografica.Longitude) : (double?)null;

                if (entrega.PuntoEntrega != null && entrega.PuntoEntrega.ReferenciaGeografica != null &&
                    entrega.PuntoEntrega.ReferenciaGeografica.Poligono != null)
                {
                    Radio = entrega.PuntoEntrega.ReferenciaGeografica.Poligono.Radio;
                }
            }
        }