/** * {@inheritdoc} */ public function fromString($string) : Workout { $simpleXML = new \SimpleXMLElement($string); $workout = new Workout(); foreach ($simpleXML->Activities[0] as $simpleXMLActivity) { // Sport. $attributes = $simpleXMLActivity->attributes(); $sport = SportMapperInterface::class; if (isset($attributes['Sport'])) { $sport = SportGuesser::sportFromCode((string) $attributes['Sport']); } $workoutTrack = new Track(array(), $sport); // Track points. foreach ($simpleXMLActivity->Lap as $lap) { foreach ($lap->Track as $track) { foreach ($track->Trackpoint as $trackPoint) { $dateTime = new \DateTime((string) $trackPoint->Time); $latitude = (double) $trackPoint->Position->LatitudeDegrees; $longitude = (double) $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.69145, 176.079795, new \DateTime('2014-06-01 00:00:00')); $startPoint->setDistance(250); $destination = new TrackPoint(-38.6914501, 176.0797951, new \DateTime('2014-06-01 00:01:01')); $destination->setDistance(1000); $actual = $startPoint->speed($destination); self::assertEquals(44.26229508196722, $actual); }
/** * Get a track point. * * @param float $latitude The latitude. * @param float $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(float $latitude, float $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; }