Beispiel #1
0
        /// <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;
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
        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;
        }
Beispiel #6
0
 public TrackingFilter(TrackingOptions options)
 {
     _options = options;
 }
Beispiel #7
0
        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;
        }
Beispiel #8
0
 public TrackingFilter(TrackingOptions options)
 {
     _options = options;
 }
Beispiel #9
0
 public TrackBuilder(TrackingOptions options)
 {
     _options = options;
     _filter  = new TrackingFilter(options);
 }
Beispiel #10
0
 public Tracker()
 {
     Options = new TrackingOptions();
 }
Beispiel #11
0
 public TrackBuilder(TrackingOptions options)
 {
     _options = options;
     _filter = new TrackingFilter(options);
 }