using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Windows.Forms; using MapGoogle; using SafeMobileLib; using ReportsLibrary; //using MapPoint; //using AxMapPoint; namespace Safedispatch_4_0 { class CalcStops { public ArrayList Positions = new ArrayList(); public ArrayList StopsList = new ArrayList(); ArrayList IndexRemove = new ArrayList(); //SMdb_access smdbObj; double delta; Double stopreflat; Double stopreflng; Int64 stoptime; int startidx = 0; int count = -1; Boolean stopset = false; Boolean first; int idxread; Int64 zone1OUTtime; Double startlat; Double startlng; Int32 entertime, exittime; int startcount; private AxMappointControlx mapControl; private Boolean CalcAddr; struct IndexCut { public int IndCut; public Int32 LastTime; } public CalcStops(AxMappointControlx mapControlParam, Boolean CalcAddrParam) { mapControl = mapControlParam; CalcAddr = CalcAddrParam; } public void get_position(ArrayList ListIN) { if(ListIN != null) foreach (PositionData obj in ListIN) Positions.Add(new PositionData(obj.Lat,obj.Lng,obj.Address,obj.TimeGMT,obj.Type,obj.Speed)); } public static double GetAverage(ArrayList Values) { double mean = 0; foreach (double average in Values) { mean += average; } if (Values.Count!=0) mean /= Values.Count; return mean; } public static ArrayList LATAver = new ArrayList(); public static ArrayList LNGAver = new ArrayList(); public void calculate_zone() { delta = MainForm2.Delta1 * 0.00001;//0.0007; if (Positions.Count > 0) { stopreflat = ((PositionData)Positions[0]).Lat; stopreflng = ((PositionData)Positions[0]).Lng; stoptime = ((PositionData)Positions[0]).TimeGMT; startidx = 0; count = -1; stopset = false; PositionData prevobj=null; PositionData obj = null; // long timeToCompare = 0; while (count < (Positions.Count - 1)) { count++; obj = (PositionData)Positions[count]; ((PositionData)Positions[count]).Type = car_state_e.CAR_RUNNING; if (prevobj == null || (obj.TimeGMT - prevobj.TimeGMT) > (((Vehicle)MainForm2.vehicleHT[MainForm2.NameReport]).gps_interval * 4.1)) // 10 mins //!!modif this { if (!stopset) { ((PositionData)Positions[count]).Type = car_state_e.CAR_START; if (prevobj != null && prevobj.Type == car_state_e.CAR_RUNNING) { ((PositionData)Positions[count - 1]).Type = car_state_e.CAR_STOP; } LATAver.Clear(); LNGAver.Clear(); stopreflat = ((PositionData)Positions[count]).Lat; stopreflng = ((PositionData)Positions[count]).Lng; LATAver.Add(stopreflat); LNGAver.Add(stopreflng); stoptime = ((PositionData)Positions[count]).TimeGMT; startidx = count + 1; prevobj = obj; continue; } } if (((obj.Lat < (stopreflat + delta)) && (obj.Lat > (stopreflat - delta))) && ((obj.Lng < (stopreflng + delta)) && (obj.Lng > (stopreflng - delta)))) { if (!stopset) { if (obj.TimeGMT > (stoptime + ((Vehicle)MainForm2.vehicleHT[MainForm2.NameReport]).gps_interval * 4.1)) //4.1 sa lipsesca 4 semnale GPS si un pic { stopset = true; for (int i = startidx; i <= count; i++) { if (startidx > 0 && ((PositionData)Positions[startidx - 1]).Type == car_state_e.CAR_START) ((PositionData)Positions[i]).Type = car_state_e.CAR_START; else ((PositionData)Positions[i]).Type = car_state_e.CAR_STOP; LATAver.Add(((PositionData)Positions[i]).Lat); LNGAver.Add(((PositionData)Positions[i]).Lng); //stopreflat = (stopreflat+((PositionData)Positions[i]).Lat)/2; //stopreflng = (stopreflng + ((PositionData)Positions[i]).Lng) / 2; } stopreflat = GetAverage(LATAver); stopreflng = GetAverage(LNGAver); } } else { if (startidx > 0 && ((PositionData)Positions[startidx - 1]).Type == car_state_e.CAR_START) ((PositionData)Positions[count]).Type = car_state_e.CAR_START; else ((PositionData)Positions[count]).Type = car_state_e.CAR_STOP; //stopreflat = (stopreflat + ((PositionData)Positions[count]).Lat) / 2; //stopreflng = (stopreflng + ((PositionData)Positions[count]).Lng) / 2; LATAver.Add(((PositionData)Positions[count]).Lat); LNGAver.Add(((PositionData)Positions[count]).Lng); stopreflat = GetAverage(LATAver); stopreflng = GetAverage(LNGAver); } prevobj = obj; } else { Int32 step = 0; Boolean stay = true; while ((step < 6)&&(stay)) { step++; if ((count + step+1) < Positions.Count) { if ((((((PositionData)Positions[count + step]).Lat < (stopreflat + delta)) && (((PositionData)Positions[count + step]).Lat > (stopreflat - delta))) && ((((PositionData)Positions[count + step]).Lng < (stopreflng + delta)) && (((PositionData)Positions[count + step]).Lng > (stopreflng - delta))))&& (((((PositionData)Positions[count + step+1]).Lat < (stopreflat + delta)) && (((PositionData)Positions[count + step+1]).Lat > (stopreflat - delta))) && ((((PositionData)Positions[count + step+1]).Lng < (stopreflng + delta)) && (((PositionData)Positions[count + step+1]).Lng > (stopreflng - delta))))) { if (stopset) { if (startidx > 0 && ((PositionData)Positions[startidx - 1]).Type == car_state_e.CAR_START) { ((PositionData)Positions[count]).Type = car_state_e.CAR_START; for (int i = 1; i <= step; i++) ((PositionData)Positions[count + i]).Type = car_state_e.CAR_START; } else { ((PositionData)Positions[count]).Type = car_state_e.CAR_STOP; //((PositionData)Positions[count + 1]).Type = car_state_e.CAR_STOP; for (int i = 1; i <= step; i++) ((PositionData)Positions[count + i]).Type = car_state_e.CAR_STOP; } } else { //((PositionData)Positions[count + 1]).Type = car_state_e.CAR_RUNNING; for (int i = 1; i <= step; i++) ((PositionData)Positions[count + i]).Type = car_state_e.CAR_RUNNING; } count= count + step; stay = false; } else stay = true; } else stay = false; } if (stay) { stopreflat = obj.Lat; stopreflng = obj.Lng; stoptime = obj.TimeGMT; startidx = count; stopset = false; prevobj = obj; } } } } // make the last pos a stop if (count != -1) if (((PositionData)Positions[Positions.Count - 1]).Type == car_state_e.CAR_RUNNING) ((PositionData)Positions[Positions.Count - 1]).Type = car_state_e.CAR_STOP; } public Double calcDistance(Int32 start,Int32 stop) { PositionData prevobj = null; Double totalDistance = 0; foreach (PositionData obj in Positions) { if ((obj.TimeGMT >= start) && (obj.TimeGMT <= stop)) { if (prevobj != null) { DistanceCalc tmp = new DistanceCalc(prevobj.Lat, prevobj.Lng, obj.Lat, obj.Lng); totalDistance += tmp.GetDistance(); } prevobj = obj; } } return totalDistance; } public void calc_zone_with_delta2() { first = false; idxread = 0; zone1OUTtime = 0; if (Positions.Count != 0) zone1OUTtime = ((PositionData)Positions[0]).TimeGMT; startlat = 0; startlng = 0; count = -1; delta = MainForm2.Delta2 * 0.00001;//0.001; //test filtrat CAR_STOP CAR_START CAR_STOP BEFORE try { for (int i = 0; i < Positions.Count; i++) { if (((PositionData)(Positions[i])).Type == car_state_e.CAR_STOP) { if (((i + 1) < Positions.Count)&&(((PositionData)(Positions[i + 1])).Type == car_state_e.CAR_START)) { Int32 Step = i + 2; car_state_e typeFind = car_state_e.CAR_START; while ((Step < Positions.Count)&&(typeFind==car_state_e.CAR_START)) { if (((PositionData)(Positions[Step])).Type == car_state_e.CAR_RUNNING) typeFind = car_state_e.CAR_RUNNING; else if (((PositionData)(Positions[Step])).Type == car_state_e.CAR_STOP) typeFind = car_state_e.CAR_STOP; Step++; } if (typeFind == car_state_e.CAR_STOP) { for (int j=(i+1);j<(Step-1);j++) ((PositionData)(Positions[j])).Type = car_state_e.CAR_STOP; } } } } for (int i = 0; i < Positions.Count; i++) { if (((PositionData)(Positions[i])).Type == car_state_e.CAR_RUNNING) { if (((i + 1) < Positions.Count) && (((PositionData)(Positions[i + 1])).Type == car_state_e.CAR_START)) { if (((i + 2) < Positions.Count) && (((PositionData)(Positions[i + 2])).Type == car_state_e.CAR_RUNNING)) { ((PositionData)(Positions[i + 1])).Type = car_state_e.CAR_RUNNING; } } } } } catch (Exception ex) { SM.Debug("Error on CAR_STOP CAR_START CAR_STOP filter" + ex.ToString()); } foreach (PositionData obj in Positions) { count++; //if ((obj.type == car_state_e.CAR_STOP || obj.type == car_state_e.CAR_START) && (!first)) if ((obj.Type == car_state_e.CAR_STOP) && (!first)) { //if ((obj.TimeGMT - zone1OUTtime) < (((Vehicle)MainForm2.vehicleHT[MainForm2.NameReport]).gps_interval * 4.1)) //300 //{ if (((obj.Lat > (startlat - delta)) && (obj.Lat < (startlat + delta))) && ((obj.Lng > (startlng - delta)) && (obj.Lng < (startlng + delta)))) { for (int i = idxread; i < count; i++) ((PositionData)Positions[i]).Type = obj.Type; } //} startlat = obj.Lat; startlng = obj.Lng; first = true; } //if ((obj.type == car_state_e.CAR_STOP || obj.type == car_state_e.CAR_START) && (first)) if ((obj.Type == car_state_e.CAR_STOP) && (first)) { zone1OUTtime = obj.TimeGMT; } if ((obj.Type == car_state_e.CAR_RUNNING) && (first)) { first = false; idxread = count; } } //test filtrat CAR_STOP CAR_START CAR_STOP AFTER try { for (int i = 0; i < Positions.Count; i++) { if (((PositionData)(Positions[i])).Type == car_state_e.CAR_STOP) { if (((i + 1) < Positions.Count) && (((PositionData)(Positions[i + 1])).Type == car_state_e.CAR_START)) { Int32 Step = i + 2; car_state_e typeFind = car_state_e.CAR_START; while ((Step < Positions.Count) && (typeFind == car_state_e.CAR_START)) { if (((PositionData)(Positions[Step])).Type == car_state_e.CAR_RUNNING) typeFind = car_state_e.CAR_RUNNING; else if (((PositionData)(Positions[Step])).Type == car_state_e.CAR_STOP) typeFind = car_state_e.CAR_STOP; Step++; } if (typeFind == car_state_e.CAR_STOP) { for (int j = (i + 1); j < (Step - 1); j++) ((PositionData)(Positions[j])).Type = car_state_e.CAR_STOP; } } } } } catch (Exception ex) { SM.Debug("Error on CAR_STOP CAR_START CAR_STOP filter" + ex.Message); } } public Stops Create_new_Stop(int StartCount, int StopCount, ArrayList Positions, Int32 EnterTime, Int32 ExitTime, car_state_e type) { ArrayList ListOfAddress = new ArrayList(); ArrayList ListLat = new ArrayList(); ArrayList ListLng = new ArrayList(); Double LatMed = 0; Double LngMed = 0; for (int i = StartCount; i < StopCount; i++) { ListLat.Add(((PositionData)Positions[i]).Lat); ListLng.Add(((PositionData)Positions[i]).Lng); } for (int i = StartCount; i < StopCount; i++) { LatMed = LatMed + ((PositionData)Positions[i]).Lat; LngMed = LngMed + ((PositionData)Positions[i]).Lng; } if ((StopCount - StartCount) > 1) { LatMed = LatMed / (StopCount - StartCount); LngMed = LngMed / (StopCount - StartCount); } Stops stop = new Stops(); MainForm2.AddrCnt++; stop.name = MainForm2.AddrCnt.ToString(); stop.start = EnterTime; stop.stop = ExitTime; stop.lat = LatMed; stop.lng = LngMed; stop.type = type; return stop; } public void create_stop_list() { Boolean valBool = false; Boolean NotInsertStop = false; entertime = 0; exittime = 0; count = -1; startcount = 0; StopsList.Clear(); car_state_e type = car_state_e.CAR_RUNNING; car_state_e addtype = car_state_e.CAR_RUNNING; try { foreach (PositionData obj in Positions) { count++; if (obj.Type != car_state_e.CAR_RUNNING) { if (obj.Type != type) { if (valBool == true) { // if 2 different states one after another (ex: stop, start, r, r, .. ) if (addtype == car_state_e.CAR_STOP) { StopsList.Add(Create_new_Stop(startcount, count, Positions, entertime, exittime, addtype)); NotInsertStop = false; } else NotInsertStop = true; entertime = obj.TimeGMT; startcount = count; addtype = obj.Type; } else valBool = true; } valBool = true; } else valBool = false; type = obj.Type; if (valBool) { if (entertime == 0) { entertime = obj.TimeGMT; startcount = count; addtype = obj.Type; } } else { if (entertime != 0) { if (!NotInsertStop) { StopsList.Add(Create_new_Stop(startcount, count, Positions, entertime, exittime, addtype)); entertime = 0; } } if (obj.Type == car_state_e.CAR_RUNNING) { exittime = 0; NotInsertStop = false; } } exittime = obj.TimeGMT; } // enter the last zone if (entertime != 0) { StopsList.Add(Create_new_Stop(startcount, count + 1, Positions, entertime, exittime, addtype)); } delta = MainForm2.Delta1 * 0.00001; foreach (Stops obj in StopsList) { int cont = -1; foreach (PositionData obj2 in Positions) { cont++; if (obj2.TimeGMT == obj.start) break; } int step=cont; Boolean stay = true; while ((step > 0)&&(stay)) { step--; if ((((((PositionData)Positions[step]).Lat < (obj.lat + delta)) && (((PositionData)Positions[step]).Lat > (obj.lat - delta))) && ((((PositionData)Positions[step]).Lng < (obj.lng + delta)) && (((PositionData)Positions[step]).Lng > (obj.lng - delta))))&&(((PositionData)Positions[step]).Type == car_state_e.CAR_RUNNING)) { obj.start = ((PositionData)Positions[step]).TimeGMT; ((PositionData)Positions[step]).Type = car_state_e.CAR_START; } else stay = false; } cont = -1; foreach (PositionData obj2 in Positions) { cont++; if (obj2.TimeGMT == obj.stop) break; } step = cont; stay = true; while ((step < (Positions.Count-1)) && (stay)) { step++; if ((((((PositionData)Positions[step]).Lat < (obj.lat + delta)) && (((PositionData)Positions[step]).Lat > (obj.lat - delta))) && ((((PositionData)Positions[step]).Lng < (obj.lng + delta)) && (((PositionData)Positions[step]).Lng > (obj.lng - delta)))) && (((PositionData)Positions[step]).Type == car_state_e.CAR_RUNNING)) { obj.stop = ((PositionData)Positions[step]).TimeGMT; ((PositionData)Positions[step]).Type = car_state_e.CAR_STOP; } else stay = false; } } } catch (Exception ex) { throw new ArgumentException("Error on create StopList:"+ex.ToString()); } } public ArrayList create_stop_list_EON(Int32 IdleTime) { entertime = 0; exittime = 0; count = -1; startcount = -1; Double latmed = 0; Double lngmed = 0; //uint limittime = 120; // un minut jumatate long limittime = 30; // jumate un minut jumatate long oldtime=0; Int32 intDiff = 0; Double stepdist =0.00030; StopsList.Clear(); car_state_e addtype = car_state_e.CAR_STOP; try { //smdbObj = new SMdb_access(MainForm2.mssqlbool); // smdbObj.InitConnection(m_server, m_dbname, m_user, m_password); //caluculate time between to message for a good detection of idle ArrayList TmpTime = new ArrayList(); Boolean first =false; foreach (PositionData obj in Positions) { if (!first) first = true; else { intDiff = (Int32)(obj.TimeGMT - oldtime); Boolean findloc = false; foreach (Time_And_Type obj2 in TmpTime) { if (((obj2.timeGMT * 0.9) <= intDiff) && ((obj2.timeGMT * 1.1) >= intDiff)) { findloc = true; obj2.type++; break; } } if (!findloc) { Time_And_Type tmp = new Time_And_Type(); tmp.timeGMT = intDiff; tmp.type = 1; TmpTime.Add(tmp); } } oldtime = obj.TimeGMT; } int max=0; foreach (Time_And_Type obj in TmpTime) { if (obj.type > max) { limittime = obj.timeGMT; max = obj.type; } } foreach (PositionData obj in Positions) { count++; // astept 3.2 //if (((obj.timeGMT - exittime) < (limittime*3.2)) && (Math.Abs(obj.lat - latmed) < stepdist) && (Math.Abs(obj.lng - lngmed) < stepdist)) //if (((obj.timeGMT - exittime) < (limittime * 2.5)) && (obj.speed < 5)) if (((obj.TimeGMT - exittime) < (limittime * 2.5)) && (obj.Speed < 5) && (Math.Abs(obj.Lat - latmed) < stepdist) && (Math.Abs(obj.Lng - lngmed) < stepdist)) { if (startcount == -1) { startcount = count-1; entertime = exittime; } latmed = Math.Min(obj.Lat,latmed) + Math.Abs(obj.Lat - latmed); lngmed = Math.Min(obj.Lng,lngmed) + Math.Abs(obj.Lng - lngmed); } else { if (startcount != -1) if ((exittime - entertime) >= (IdleTime*60)) //was count+1 StopsList.Add(Create_new_Stop(startcount, count, Positions, entertime, exittime, addtype)); startcount = -1; entertime = obj.TimeGMT; latmed = obj.Lat; lngmed = obj.Lng; } exittime = obj.TimeGMT; } // end foreach // enter the last zone if (startcount != -1) if ((exittime - entertime) >= (IdleTime * 60)) StopsList.Add(Create_new_Stop(startcount, count + 1, Positions, entertime, exittime, addtype)); } catch (Exception ex) { throw new ArgumentException("Error on creta EON:"+ex.ToString()); } return StopsList; } public void StartStopCalc() { IndexRemove.Clear(); int contStop = -1; String lastAddr = ""; IndexCut tmpCut; foreach (Stops obj in StopsList) { contStop++; if (obj.type!=car_state_e.CAR_START && (obj.name!=null)&& obj.name.CompareTo(lastAddr) == 0) { // delete the stop with the same address (stop address == final stop address) tmpCut = new IndexCut(); tmpCut.IndCut = contStop; tmpCut.LastTime = obj.stop; IndexRemove.Add(tmpCut); } lastAddr = obj.name; } int countUndo = -1; foreach (IndexCut obj in IndexRemove) { countUndo++; ((Stops)(StopsList[obj.IndCut - countUndo - 1])).stop = obj.LastTime; StopsList.RemoveAt(obj.IndCut - countUndo); } } public void StartStopCalcPosition() { count = -1; Int32 countChange = -1; Int32 countToRemove = -1; Boolean BeginRemove = false; car_state_e oldType = car_state_e.CAR_STOP; if (Positions.Count != 0) oldType = ((PositionData)Positions[0]).Type; if (oldType == car_state_e.CAR_STOP) countToRemove = 0; foreach (PositionData obj in Positions) { count++; if (oldType != obj.Type) { oldType = obj.Type; if (obj.Type == car_state_e.CAR_STOP) { countToRemove++; BeginRemove = false; foreach (IndexCut obj2 in IndexRemove) if (obj2.IndCut == countToRemove) BeginRemove = true; oldType = car_state_e.CAR_STOP; if (BeginRemove) { for(int i=countChange; i