public ProccessedTrack ProccessTrack(Track track)
 {
     ProccessedTrack pTrack = new ProccessedTrack("Фильтр Калмана",false);
     pTaL = new double[3];
     InitializeP();
     NormalRandom normRand = new NormalRandom();
     aX = Parameters[0].DoubleValue;
     aY = Parameters[1].DoubleValue;
     r = Parameters[2].DoubleValue;
     double predLatForAdd = 0;
     double predLonForAdd = 0;
     for (int i = 0; i < track.TrackItems.Length; i++)
     {
         DateTime date = track.TrackItems[i].Date;
         double[] kTal = new double[2];
         for (int j = 0; j < 2; j++)
         {
             kTal[j] = pTaL[j] / (pTaL[j] + r);
             /*pTaL[j] = (1 - kTal[j]) * pTaL[j];*/
             pTaL[j] -= (pTaL[j] > r) ? r : 0;
         }
         double predLat = predLatForAdd + aX * normRand.Next();
         double predLon = predLonForAdd + aY * normRand.Next();
         predLatForAdd = predLat + kTal[0] * (track.TrackItems[i].Latitude - predLat);
         predLonForAdd = predLon + kTal[1] * (track.TrackItems[i].Longitude - predLon);
         ProccessedTrackItem temp = new ProccessedTrackItem(track.TrackItems[i],predLatForAdd, predLonForAdd);
         pTrack.AddProccessedTrackItem(temp);
     }
     return pTrack;
 }
예제 #2
0
 /// <summary>
 /// получение обработанного трека
 /// </summary>
 /// <param name="track">Исходный трек</param>
 /// <returns>Обработанный трек</returns>
 public ProccessedTrack ProccessTrack(Track track)
 {
     ProccessedTrack pTrack = new ProccessedTrack(Message);
     avg = Parameters[0].IntegerValue;
     TrackItem[] trackItems = track.TrackItems;
     for (int i = 0; i < avg / 2; i++)
     {
         ProccessedTrackItem pItem = new ProccessedTrackItem(trackItems[i], trackItems[i].Latitude, trackItems[i].Longitude);
         pTrack.AddProccessedTrackItem(pItem);
     }
     for (int i = avg / 2; i < trackItems.Length - avg / 2; i++)
     {
         double sumLat = 0;
         double sumLon = 0;
         for (int j = i - avg / 2; j <= i + avg / 2; j++)
         {
             sumLat += trackItems[j].Latitude;
             sumLon += trackItems[j].Longitude;
         }
         sumLat /= avg + (avg + 1) % 2;
         sumLon /= avg + (avg + 1) % 2;
         ProccessedTrackItem pItem = new ProccessedTrackItem(trackItems[i], sumLat, sumLon);
         pTrack.AddProccessedTrackItem(pItem);
     }
     for (int i = trackItems.Length - avg / 2; i < trackItems.Length; i++)
     {
         ProccessedTrackItem pItem = new ProccessedTrackItem(trackItems[i], trackItems[i].Latitude, trackItems[i].Longitude);
         pTrack.AddProccessedTrackItem(pItem);
     }
     return pTrack;
 }
예제 #3
0
 public ProccessedTrack ProccessTrack(Track track)
 {
     ProccessedTrack pTrack = new ProccessedTrack(Message, false);
     foreach (TrackItem item in track.TrackItems)
     {
         double[] vec = new double[] {item.Longitude,item.Latitude };
         double[] newVec = CalcEstimation(vec);
         ProccessedTrackItem pItem = new ProccessedTrackItem(item, newVec[1], newVec[0]);
         pTrack.AddProccessedTrackItem(pItem);
     }
     return pTrack;
 }
예제 #4
0
 /// <summary>
 /// Добавить обработанную координату
 /// </summary>
 /// <param name="item">Обработанная координата</param>
 public void AddProccessedTrackItem(ProccessedTrackItem item)
 {
     processedTrackItems.Add(item);
 }
예제 #5
0
 /// <summary>
 /// обработать таблицу с обработанным треком
 /// </summary>
 /// <param name="dataTable">Таблица</param>
 /// <returns>Обработанный трек</returns>
 private ProccessedTrack ParseProccessedDataTable(DataTable dataTable)
 {
     bool isVector = dataTable.Columns.Count > 7;
     ProccessedTrack pTrack = new ProccessedTrack(dataTable.TableName.Replace('_', ' ').Replace("$", ""), isVector);
     DataRow[] dataRows = dataTable.Select();
     if (isVector)
     {
         foreach (DataRow row in dataRows)
         {
             double stlat = (double)row[1];
             double stlon = (double)row[2];
             DateTime stdate = (DateTime)row[3];
             double enlat = (double)row[4];
             double enlon = (double)row[5];
             DateTime endate = (DateTime)row[6];
             TimeSpan lapse = endate - stdate;
             double oSpeed = (double)row[8];
             double pSpeed = (double)row[9];
             double oDist = (double)row[10];
             double pDist = (double)row[11];
             double oHead = (double)row[12];
             double pHead = (double)row[13];
             TrackItem stItem = new TrackItem(stlat, stlon, stdate);
             TrackItem enItem = new TrackItem(enlat, enlon, endate);
             TrackVectorItem vItem = new TrackVectorItem(stItem, enItem);
             ProccessedTrackVectorItem pVector = new ProccessedTrackVectorItem(vItem, pSpeed, pDist, pHead);
             pTrack.AddProccedTrackVectorItem(pVector);
         }
     }
     else
     {
         foreach (DataRow row in dataRows)
         {
             double lat = (double)row[1];
             double lon = (double)row[2];
             DateTime date = (DateTime)row[3];
             double plat = (double)row[4];
             double plon = (double)row[5];
             double dist = (double)row[6];
             TrackItem item = new TrackItem(lat, lon, date);
             ProccessedTrackItem pItem = new ProccessedTrackItem(item, plat, plon);
             pTrack.AddProccessedTrackItem(pItem);
         }
     }
     return pTrack;
 }
 /// <summary>
 /// Получить трек со средними разносятми
 /// </summary>
 /// <param name="pTrack">Трек с разносятми</param>
 /// <param name="track">Исходный трек</param>
 /// <returns>Трек со средними разносятми</returns>
 private ProccessedTrack GetAvgDifferences(ProccessedTrack pTrack, Track track)
 {
     ProccessedTrackItem[] pItems = pTrack.ProccessedTrackItems;
     ProccessedTrack res = new ProccessedTrack("Средние разности");
     for (int i = 0; i < avg / 2 + 1;i++ )
     {
         res.AddProccessedTrackItem(pItems[i]);
     }
     TrackItem[] trackItems = track.TrackItems;
     for (int i = avg / 2 + 1;i<pItems.Length-avg/2 ; i++)
     {
         double sumLat = 0;
         double sumLon = 0;
         for (int j = i - avg / 2; j <= i + avg / 2; j++)
         {
             sumLat += pItems[j].ProccessedLatitude;
             sumLon += pItems[j].ProccessedLongitude;
         }
         sumLat /= avg;
         sumLon /= avg;
         ProccessedTrackItem pItem = new ProccessedTrackItem(trackItems[i], sumLat, sumLon);
         res.AddProccessedTrackItem(pItem);
     }
     for (int i = trackItems.Length - avg / 2; i < trackItems.Length; i++)
     {
         res.AddProccessedTrackItem(pItems[i]);
     }
     return res;
 }