/// <summary> /// Create a segment based on two dirty points /// </summary> public Segment(Point begin, Point end, TrackingOptions options) { _options = options; BeginTime = begin.Time; BeginLatitude = begin.Latitude; BeginLongitude = begin.Longitude; EndTime = end.Time; EndLatitude = end.Latitude; EndLongitude = end.Longitude; SatellitesCount = Math.Min(begin.SatellitesCount, end.SatellitesCount); IsBreak = Distance > _options.BreakDistance && Duration.TotalSeconds >= _options.BreakDuration; }
public Segment Execute(Segment segment, TrackingOptions options) { if (segment.IsBreak) { _buffer.Clear(); return(segment); } _buffer.Add(segment); var entireFactory = new SegmentFactory(0, _buffer.Count); entireFactory.BuildApproximation(_buffer, options); if (entireFactory.ApproximationDevialtion < Tolerance || _buffer.Count < 3) { return(entireFactory.Segment); } SegmentFactory resultFactory = null; double resultError = 0; for (int i = _buffer.Count - 1; i >= 1; i--) { var mainFactory = new SegmentFactory(0, i); mainFactory.BuildApproximation(_buffer, options); var extraFactory = new SegmentFactory(i, _buffer.Count - i); extraFactory.BuildApproximation(_buffer, options); var error = mainFactory.ApproximationDevialtion + extraFactory.ApproximationDevialtion; if (resultFactory == null) { resultFactory = mainFactory; resultError = error; } else if (error < resultError) { resultFactory = mainFactory; resultError = error; } } // ReSharper disable once PossibleNullReferenceException _buffer.RemoveRange(resultFactory.InitialIndex, resultFactory.SegmentsCount); return(resultFactory.Segment); }
/// <summary> /// Create segment based on manual values /// </summary> /// <summary>Because this segment created manually, it cannot be a break</summary> public Segment(DateTime beginTime, double beginLatitude, double beginLongitude , DateTime endTime, double endLatitude, double endLongitude , int satellitesCount, TrackingOptions options) { _options = options; BeginTime = beginTime; BeginLatitude = beginLatitude; BeginLongitude = beginLongitude; EndTime = endTime; EndLatitude = endLatitude; EndLongitude = endLongitude; SatellitesCount = satellitesCount; IsBreak = false; }
public Segment Execute(Segment segment, TrackingOptions options) { if (segment.IsBreak) { _buffer.Clear(); return segment; } _buffer.Add(segment); var entireFactory = new SegmentFactory(0, _buffer.Count); entireFactory.BuildApproximation(_buffer, options); if (entireFactory.ApproximationDevialtion < Tolerance || _buffer.Count < 3) return entireFactory.Segment; SegmentFactory resultFactory = null; double resultError = 0; for (int i = _buffer.Count - 1; i >= 1; i--) { var mainFactory = new SegmentFactory(0, i); mainFactory.BuildApproximation(_buffer, options); var extraFactory = new SegmentFactory(i, _buffer.Count - i); extraFactory.BuildApproximation(_buffer, options); var error = mainFactory.ApproximationDevialtion + extraFactory.ApproximationDevialtion; if (resultFactory == null) { resultFactory = mainFactory; resultError = error; } else if (error < resultError) { resultFactory = mainFactory; resultError = error; } } // ReSharper disable once PossibleNullReferenceException _buffer.RemoveRange(resultFactory.InitialIndex, resultFactory.SegmentsCount); return resultFactory.Segment; }
public void BuildApproximation(List <Segment> buffer, TrackingOptions options) { Segment first = buffer[InitialIndex]; Segment last = buffer[InitialIndex + SegmentsCount - 1]; double averageTime = 0; double averageLatitude = 0; double averageLongitude = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; averageTime += trackSegment.BeginTime.ToOADate(); averageLatitude += trackSegment.BeginLatitude; averageLongitude += trackSegment.BeginLongitude; averageTime += trackSegment.EndTime.ToOADate(); averageLatitude += trackSegment.EndLatitude; averageLongitude += trackSegment.EndLongitude; } averageTime /= SegmentsCount * 2; averageLatitude /= SegmentsCount * 2; averageLongitude /= SegmentsCount * 2; double sumOfDeviationsInLatitude = 0; double sumOfDeviationsInLongitude = 0; double sumOfSquaresDeviationsInTime = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; double deviationByTime = trackSegment.BeginTime.ToOADate() - averageTime; sumOfSquaresDeviationsInTime += deviationByTime * deviationByTime; sumOfDeviationsInLatitude += deviationByTime * (trackSegment.BeginLatitude - averageLatitude); sumOfDeviationsInLongitude += deviationByTime * (trackSegment.BeginLongitude - averageLongitude); deviationByTime = trackSegment.EndTime.ToOADate() - averageTime; sumOfSquaresDeviationsInTime += deviationByTime * deviationByTime; sumOfDeviationsInLatitude += deviationByTime * (trackSegment.EndLatitude - averageLatitude); sumOfDeviationsInLongitude += deviationByTime * (trackSegment.EndLongitude - averageLongitude); } double lat1 = sumOfDeviationsInLatitude / sumOfSquaresDeviationsInTime; double lat0 = averageLatitude - lat1 * averageTime; double lon1 = sumOfDeviationsInLongitude / sumOfSquaresDeviationsInTime; double lon0 = averageLongitude - lon1 * averageTime; ApproximationDevialtion = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; double deviationByLatitude = trackSegment.BeginLatitude - (lat0 + lat1 * trackSegment.BeginTime.ToOADate()); ApproximationDevialtion += deviationByLatitude * deviationByLatitude; double deviationByLongitude = trackSegment.BeginLongitude - (lon0 + lon1 * trackSegment.BeginTime.ToOADate()); ApproximationDevialtion += deviationByLongitude * deviationByLongitude; deviationByLatitude = trackSegment.EndLatitude - (lat0 + lat1 * trackSegment.EndTime.ToOADate()); ApproximationDevialtion += deviationByLatitude * deviationByLatitude; deviationByLongitude = trackSegment.EndLongitude - (lon0 + lon1 * trackSegment.EndTime.ToOADate()); ApproximationDevialtion += deviationByLongitude * deviationByLongitude; } ApproximationDevialtion *= GetErrorCorrection(buffer, first.BeginTime, last.EndTime); var result = new Segment(first.BeginTime , first.BeginLatitude , first.BeginLongitude , last.EndTime , last.EndLatitude , last.EndLongitude , Math.Min(first.SatellitesCount, last.SatellitesCount) , options); Segment = result; }
public TrackingFilter(TrackingOptions options) { _options = options; }
public void BuildApproximation(List<Segment> buffer, TrackingOptions options) { Segment first = buffer[InitialIndex]; Segment last = buffer[InitialIndex + SegmentsCount - 1]; double averageTime = 0; double averageLatitude = 0; double averageLongitude = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; averageTime += trackSegment.BeginTime.ToOADate(); averageLatitude += trackSegment.BeginLatitude; averageLongitude += trackSegment.BeginLongitude; averageTime += trackSegment.EndTime.ToOADate(); averageLatitude += trackSegment.EndLatitude; averageLongitude += trackSegment.EndLongitude; } averageTime /= SegmentsCount * 2; averageLatitude /= SegmentsCount * 2; averageLongitude /= SegmentsCount * 2; double sumOfDeviationsInLatitude = 0; double sumOfDeviationsInLongitude = 0; double sumOfSquaresDeviationsInTime = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; double deviationByTime = trackSegment.BeginTime.ToOADate() - averageTime; sumOfSquaresDeviationsInTime += deviationByTime * deviationByTime; sumOfDeviationsInLatitude += deviationByTime * (trackSegment.BeginLatitude - averageLatitude); sumOfDeviationsInLongitude += deviationByTime * (trackSegment.BeginLongitude - averageLongitude); deviationByTime = trackSegment.EndTime.ToOADate() - averageTime; sumOfSquaresDeviationsInTime += deviationByTime * deviationByTime; sumOfDeviationsInLatitude += deviationByTime * (trackSegment.EndLatitude - averageLatitude); sumOfDeviationsInLongitude += deviationByTime * (trackSegment.EndLongitude - averageLongitude); } double lat1 = sumOfDeviationsInLatitude / sumOfSquaresDeviationsInTime; double lat0 = averageLatitude - lat1 * averageTime; double lon1 = sumOfDeviationsInLongitude / sumOfSquaresDeviationsInTime; double lon0 = averageLongitude - lon1 * averageTime; ApproximationDevialtion = 0; for (int i = InitialIndex; i < InitialIndex + SegmentsCount; i++) { Segment trackSegment = buffer[i]; double deviationByLatitude = trackSegment.BeginLatitude - (lat0 + lat1 * trackSegment.BeginTime.ToOADate()); ApproximationDevialtion += deviationByLatitude * deviationByLatitude; double deviationByLongitude = trackSegment.BeginLongitude - (lon0 + lon1 * trackSegment.BeginTime.ToOADate()); ApproximationDevialtion += deviationByLongitude * deviationByLongitude; deviationByLatitude = trackSegment.EndLatitude - (lat0 + lat1 * trackSegment.EndTime.ToOADate()); ApproximationDevialtion += deviationByLatitude * deviationByLatitude; deviationByLongitude = trackSegment.EndLongitude - (lon0 + lon1 * trackSegment.EndTime.ToOADate()); ApproximationDevialtion += deviationByLongitude * deviationByLongitude; } ApproximationDevialtion *= GetErrorCorrection(buffer, first.BeginTime, last.EndTime); var result = new Segment(first.BeginTime , first.BeginLatitude , first.BeginLongitude , last.EndTime , last.EndLatitude , last.EndLongitude , Math.Min(first.SatellitesCount, last.SatellitesCount) , options); Segment = result; }
public TrackBuilder(TrackingOptions options) { _options = options; _filter = new TrackingFilter(options); }
public Tracker() { Options = new TrackingOptions(); }