/**
  * Get a workout from a string.
  *
  * @param string $string The data.
  * @return \SportTrackerConnector\Workout\Workout
  */
 public function fromString($string)
 {
     $simpleXML = new SimpleXMLElement($string);
     $workout = new Workout();
     foreach ($simpleXML->Activities[0] as $simpleXMLActivity) {
         $workoutTrack = new Track();
         // Sport.
         $attributes = $simpleXMLActivity->attributes();
         if (isset($attributes['Sport'])) {
             $workoutTrack->setSport(SportGuesser::getSportFromCode((string) $attributes['Sport']));
         }
         // Track points.
         foreach ($simpleXMLActivity->Lap as $lap) {
             foreach ($lap->Track as $track) {
                 foreach ($track->Trackpoint as $trackPoint) {
                     $dateTime = new DateTime($trackPoint->Time);
                     $latitude = (string) $trackPoint->Position->LatitudeDegrees;
                     $longitude = (string) $trackPoint->Position->LongitudeDegrees;
                     $workoutTrackPoint = new TrackPoint($latitude, $longitude, $dateTime);
                     $workoutTrackPoint->setElevation(round((double) $trackPoint->AltitudeMeters, 2));
                     if ($trackPoint->DistanceMeters) {
                         $workoutTrackPoint->setDistance($trackPoint->DistanceMeters);
                     }
                     $extensions = $this->parseExtensions($trackPoint);
                     $workoutTrackPoint->setExtensions($extensions);
                     $workoutTrack->addTrackPoint($workoutTrackPoint);
                 }
             }
         }
         $workout->addTrack($workoutTrack);
     }
     return $workout;
 }
 /**
  * Test speed calculation where the start point and destination point have a distance.
  */
 public function testSpeedForPointsWhereStartAndDestinationPointsHaveDistance()
 {
     $startPoint = new TrackPoint('-38.691450', '176.079795', new DateTime('2014-06-01 00:00:00'));
     $startPoint->setDistance(250);
     $destinationTrackPoint = new TrackPoint('-38.6914501', '176.0797951', new DateTime('2014-06-01 00:01:01'));
     $destinationTrackPoint->setDistance(1000);
     $actual = $startPoint->speed($destinationTrackPoint);
     $this->assertEquals(44.26229508196722, $actual);
 }
 /**
  * Get a track point.
  *
  * @param string $latitude The latitude.
  * @param string $longitude The longitude.
  * @param string $time The time.
  * @param float $distance The distance from start to that point.
  * @param integer $elevation The elevation.
  * @param integer $heartRate The heart rate.
  * @return TrackPoint
  */
 private function getTrackPoint($latitude, $longitude, $time, $elevation, $distance = null, $heartRate = null)
 {
     $trackPoint = new TrackPoint($latitude, $longitude, new DateTime($time));
     $trackPoint->setElevation($elevation);
     $trackPoint->setDistance($distance);
     if ($heartRate !== null) {
         $trackPoint->setExtensions(array(new HR($heartRate)));
     }
     return $trackPoint;
 }