コード例 #1
0
        public void Import()
        {
            _importResult = new ImportResult();
            if (BeginWork != null)
            {
                BeginWork(this, new EventArgs());
            }

            // The trackpoints
            var      routeSegments = new List <RouteSegment>();
            var      rs            = new RouteSegment();
            var      current       = 0;
            var      total         = _trackToImport.GetTrackInfo().NumbetOfTrackPoints;
            var      elapsedTimes  = new List <double>();
            DateTime startTime     = DateTime.MinValue;

            foreach (var tp in _trackToImport.GetTrackPoints())
            {
                var waypoint = new Waypoint
                {
                    Time     = tp.Time,
                    LongLat  = new LongLat((double)tp.Longitude, (double)tp.Latitude),
                    Altitude = tp.Altitude
                };

                if (tp.HasMark(RegSEPointType.WayPoint))
                {
                    elapsedTimes.Add((tp.Time - startTime).TotalSeconds);
                }

                rs.Waypoints.Add(waypoint);
                current++;
                if (WorkProgress != null && current % 10 == 0)
                {
                    WorkProgress(this, new WorkProgressEventArgs((double)current / total));
                }
            }
            if (rs.Waypoints.Count > 0)
            {
                routeSegments.Add(rs);
            }
            _importResult.Route = new Route(routeSegments);

            // create one lap (from start to finish)
            LapCollection laps = RouteImporterUtil.CreateLapsFromElapsedTimes(startTime, elapsedTimes, routeSegments);

            _importResult.Laps = laps;

            _importResult.Succeeded = true;
            if (EndWork != null)
            {
                EndWork(this, new EventArgs());
            }
        }
コード例 #2
0
        public void Import()
        {
            _importResult = new ImportResult();
            if (BeginWork != null)
            {
                BeginWork(this, new EventArgs());
            }

            // The trackpoints
            var routeSegments = new List <RouteSegment>();
            var rs            = new RouteSegment();
            var current       = 0;
            var total         = _trackToImport.TrackPointsCount;
            var track         = _gsGH615MReader.GetTrack(_trackToImport);

            foreach (var tp in track.GetTrackPoints())
            {
                var waypoint = new Waypoint
                {
                    Time      = tp.Time,
                    LongLat   = new LongLat((double)tp.Longitude, (double)tp.Latitude),
                    Altitude  = tp.Altitude,
                    HeartRate = tp.Pulse
                };

                rs.Waypoints.Add(waypoint);
                current++;
                if (WorkProgress != null && current % 10 == 0)
                {
                    WorkProgress(this, new WorkProgressEventArgs((double)current / total));
                }
            }
            if (rs.Waypoints.Count > 0)
            {
                routeSegments.Add(rs);
            }
            _importResult.Route = new Route(routeSegments);

            // create one lap (from start to finish)
            DateTime      startTime = DateTime.MinValue;
            LapCollection laps      = RouteImporterUtil.CreateLapsFromElapsedTimes(startTime, new List <double>(), routeSegments);

            _importResult.Laps = laps;

            _importResult.Succeeded = true;
            if (EndWork != null)
            {
                EndWork(this, new EventArgs());
            }
        }
コード例 #3
0
        public void Import()
        {
            importResult = new ImportResult();
            if (BeginWork != null)
            {
                BeginWork(this, new EventArgs());
            }

            // The trackpoints
            List <RouteSegment> routeSegments     = new List <RouteSegment>();
            bool         lastTrackpointWasInvalid = false;
            bool         thisTrackpointIsInvalid  = false;
            RouteSegment rs      = new RouteSegment();
            int          current = 0;
            int          total   = sessionToImport.Trackpoints.Count;

            foreach (D303_Trk_Point_Type tp in sessionToImport.Trackpoints)
            {
                Waypoint waypoint = new Waypoint();
                waypoint.Time      = tp.TimeAsDateTime;
                waypoint.LongLat   = new LongLat(tp.Position.LongitudeAsDegrees, tp.Position.LatitudeAsDegrees);
                waypoint.Altitude  = (double)tp.Altitude;
                waypoint.HeartRate = (double)tp.HeartRate;

                thisTrackpointIsInvalid = (tp.Position.Latitude == 2147483647 && tp.Position.Longitude == 2147483647);
                if (!thisTrackpointIsInvalid)
                {
                    rs.Waypoints.Add(waypoint);
                }
                if (thisTrackpointIsInvalid && lastTrackpointWasInvalid && rs.Waypoints.Count > 0)
                {
                    routeSegments.Add(rs);
                    rs = new RouteSegment();
                }
                lastTrackpointWasInvalid = thisTrackpointIsInvalid;
                current++;
                if (WorkProgress != null && current % 10 == 0)
                {
                    WorkProgress(this, new WorkProgressEventArgs((double)current / total));
                }
            }
            if (rs.Waypoints.Count > 0)
            {
                routeSegments.Add(rs);
            }

            // The laps
            List <double> elapsedTimes = new List <double>();
            double        elapsedTime  = 0;
            DateTime      startTime    = DateTime.MinValue;

            foreach (D1001_Lap_Type xLap in sessionToImport.Laps)
            {
                if (startTime == DateTime.MinValue)
                {
                    startTime = xLap.StartTimeAsDateTime;
                }
                elapsedTimes.Add(elapsedTime);
                elapsedTime += (double)xLap.TotalTime / 100;
            }
            LapCollection laps = RouteImporterUtil.CreateLapsFromElapsedTimes(startTime, elapsedTimes, routeSegments);

            importResult.Route     = new Route(routeSegments);
            importResult.Laps      = laps;
            importResult.Succeeded = true;
            if (EndWork != null)
            {
                EndWork(this, new EventArgs());
            }
        }
コード例 #4
0
        public void Import()
        {
            importResult = new ImportResult();

            if (BeginWork != null)
            {
                BeginWork(this, new EventArgs());
            }

            XmlTextReader       reader    = new XmlTextReader(FileName);
            XPathDocument       doc       = new XPathDocument(reader);
            XPathNavigator      nav       = doc.CreateNavigator();
            XmlNamespaceManager nsManager = new XmlNamespaceManager(nav.NameTable);

            nsManager.AddNamespace("ns", "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2");
            XPathNodeIterator activities = nav.Select("//ns:Activity", nsManager);

            while (activities.MoveNext())
            {
                XPathNavigator id = activities.Current.SelectSingleNode("ns:Id", nsManager);
                if (id != null && DateTime.Parse(id.Value).ToString("yyyy-MM-dd HH:mm:ss") == IdToImport)
                {
                    // the activity was found

                    // the laps
                    XPathNodeIterator   lapNodes      = activities.Current.Select("ns:Lap", nsManager);
                    List <RouteSegment> routeSegments = new List <RouteSegment>();
                    RouteSegment        routeSegment  = new RouteSegment();
                    while (lapNodes.MoveNext())
                    {
                        // the tracks
                        XPathNodeIterator trackNodes = lapNodes.Current.Select("ns:Track", nsManager);
                        int trackCount = 0;
                        while (trackNodes.MoveNext())
                        {
                            if (trackCount > 0)
                            {
                                if (routeSegment.Waypoints.Count > 1)
                                {
                                    routeSegments.Add(routeSegment);
                                }
                                routeSegment = new RouteSegment();
                            }
                            XPathNodeIterator trackpointNodes = trackNodes.Current.Select("ns:Trackpoint", nsManager);
                            DateTime          lastTime        = DateTime.MinValue;
                            LongLat           lastLongLat     = null;
                            int trackpointCount = 0;
                            while (trackpointNodes.MoveNext())
                            {
                                Waypoint waypoint = new Waypoint();
                                waypoint.Time = DateTime.Parse(trackpointNodes.Current.SelectSingleNode("ns:Time", nsManager).Value).ToUniversalTime();
                                XPathNavigator position = trackpointNodes.Current.SelectSingleNode("ns:Position", nsManager);
                                if (position != null)
                                {
                                    waypoint.LongLat = new LongLat(
                                        position.SelectSingleNode("ns:LongitudeDegrees", nsManager).ValueAsDouble,
                                        position.SelectSingleNode("ns:LatitudeDegrees", nsManager).ValueAsDouble);
                                }
                                if (trackpointNodes.Current.SelectSingleNode("ns:AltitudeMeters", nsManager) != null)
                                {
                                    waypoint.Altitude =
                                        trackpointNodes.Current.SelectSingleNode("ns:AltitudeMeters", nsManager).ValueAsDouble;
                                }
                                if (trackpointNodes.Current.SelectSingleNode("ns:HeartRateBpm/ns:Value", nsManager) != null)
                                {
                                    waypoint.HeartRate =
                                        trackpointNodes.Current.SelectSingleNode("ns:HeartRateBpm/ns:Value", nsManager).ValueAsDouble;
                                }

                                // do not add waypoint if it has the same location or time as the previous one
                                if (waypoint.LongLat != null && !waypoint.LongLat.Equals(lastLongLat) && waypoint.Time != lastTime)
                                {
                                    // special handling for positionless trackpoint in the beginning, use its time together with next position
                                    if (trackpointCount == 1 && lastLongLat == null && routeSegment.Waypoints.Count == 0)
                                    {
                                        waypoint.Time = lastTime;
                                    }
                                    routeSegment.Waypoints.Add(waypoint);
                                }
                                lastLongLat = waypoint.LongLat;
                                lastTime    = waypoint.Time;
                                trackpointCount++;
                            }
                            if (lastLongLat == null && routeSegment.Waypoints.Count > 1)
                            {
                                // special handling for positionless trackpoint in the end, use its time together with previous position
                                routeSegment.Waypoints[routeSegment.Waypoints.Count - 1].Time = lastTime;
                            }
                            trackCount++;
                        }
                    }

                    // add last route segment
                    if (routeSegment.Waypoints.Count > 1)
                    {
                        routeSegments.Add(routeSegment);
                    }

                    // set position of all start and end waypoints of the route segments if they are null
                    foreach (RouteSegment rs in routeSegments)
                    {
                        if (rs.FirstWaypoint.LongLat == null && rs.Waypoints.Count > 1)
                        {
                            rs.Waypoints[1] = rs.Waypoints[1].Clone();
                        }
                        if (rs.LastWaypoint.LongLat == null && rs.Waypoints.Count > 1)
                        {
                            rs.Waypoints[rs.Waypoints.Count - 1] = rs.Waypoints[rs.Waypoints.Count - 2].Clone();
                        }
                    }


                    // the laps
                    lapNodes = activities.Current.Select("ns:Lap", nsManager);
                    // first store all elapsed times
                    List <double> elapsedTimes = new List <double>();
                    LapCollection laps         = new LapCollection();
                    if (lapNodes.MoveNext())
                    {
                        DateTime startTime   = DateTime.Parse(lapNodes.Current.GetAttribute("StartTime", ""));
                        double   elapsedTime = 0;
                        do
                        {
                            elapsedTimes.Add(elapsedTime);
                            elapsedTime += lapNodes.Current.SelectSingleNode("ns:TotalTimeSeconds", nsManager).ValueAsDouble;
                        } while (lapNodes.MoveNext());


                        laps = RouteImporterUtil.CreateLapsFromElapsedTimes(startTime, elapsedTimes, routeSegments);
                    }

                    importResult.Route     = new Route(routeSegments);
                    importResult.Laps      = laps;
                    importResult.Succeeded = importResult.Route.Segments.Count > 0;
                    if (importResult.Route.Segments.Count == 0)
                    {
                        importResult.Error = ImportError.NoWaypoints;
                    }

                    break;
                }
            }
            reader.Close();
            if (EndWork != null)
            {
                EndWork(this, new EventArgs());
            }
        }