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); }
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()); }
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()); }
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); }
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()); }
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(); }
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); }
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); }
/// <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()); }
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 }); }
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; }
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; }
/// <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); }
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); }
/// <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()); }
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); }
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(); }
/// <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); }
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); }
/// <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); }
/// <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); }
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; } } }
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); }
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; } } }
/// <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); }
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; } } }