GPX::load()   B
last analyzed

Complexity

Conditions 5
Paths 10

Size

Total Lines 39
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 39
rs 8.439
c 0
b 0
f 0
cc 5
eloc 23
nc 10
nop 1
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace SportTrackerConnector\Core\Workout\Loader;
6
7
use SportTrackerConnector\Core\Workout\Author;
8
use SportTrackerConnector\Core\Workout\Extension\ExtensionInterface;
9
use SportTrackerConnector\Core\Workout\Extension\HR;
10
use SportTrackerConnector\Core\Workout\SportGuesser;
11
use SportTrackerConnector\Core\Workout\SportMapperInterface;
12
use SportTrackerConnector\Core\Workout\Track;
13
use SportTrackerConnector\Core\Workout\TrackPoint;
14
use SportTrackerConnector\Core\Workout\Workout;
15
16
/**
17
 * Load a workout from GPX format.
18
 */
19
class GPX implements LoaderInterface
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24
    public function load(string $filePath): Workout
25
    {
26
        $simpleXML = new \SimpleXMLElement($filePath);
27
28
        $author = null;
29
        if (isset($simpleXML->metadata->author->name)) {
30
            $author = new Author((string)$simpleXML->metadata->author->name);
31
        }
32
33
        $tracks = [];
34
        foreach ($simpleXML->trk as $simpleXMLTrack) {
35
            // Sport.
36
            $sport = SportMapperInterface::class;
37
            if (isset($simpleXMLTrack->type)) {
38
                $sport = SportGuesser::guess((string)$simpleXMLTrack->type);
39
            }
40
41
            $points = [];
42
            // Track points.
43
            foreach ($simpleXMLTrack->trkseg->trkpt as $point) {
44
                $attributes = $point->attributes();
45
46
                $trackPoint = TrackPoint::with(
47
                    (float)$attributes['lat'],
48
                    (float)$attributes['lon'],
49
                    new \DateTimeImmutable((string)$point->time),
50
                    (float)$point->ele,
51
                    $this->parseExtensions($point->extensions)
52
                );
53
54
                $points[] = $trackPoint;
55
            }
56
            $track = new Track($points, $sport);
57
58
            $tracks[] = $track;
59
        }
60
61
        return new Workout($tracks, $author);
62
    }
63
64
    /**
65
     * Parse and return an array of extensions from the XML.
66
     *
67
     * @param \SimpleXMLElement $extensions The extensions to parse.
68
     * @return ExtensionInterface[]
69
     */
70
    protected function parseExtensions(\SimpleXMLElement $extensions): array
71
    {
72
        $extensions = $extensions->asXML();
73
        $return = array();
74
        if (preg_match('/<gpxtpx:hr>(.*)<\/gpxtpx:hr>/', $extensions, $matches)) {
75
            $return[] = HR::fromValue($matches[1]);
76
        }
77
78
        return $return;
79
    }
80
}
81