-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathgpx.go
108 lines (96 loc) · 2.04 KB
/
gpx.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"io"
"io/ioutil"
"strings"
"github.com/tkrajina/gpxgo/gpx"
)
var stravaTypeCodes = map[string]string{
"1": "Cycling",
"2": "AlpineSkiing",
"3": "BackcountrySkiing",
"4": "Hiking",
"5": "IceSkating",
"6": "InlineSkating",
"7": "CrossCountrySkiing",
"8": "RollerSkiing",
"9": "Running",
"10": "Walking",
"11": "Workout",
"12": "Snowboarding",
"13": "Snowshoeing",
"14": "Kitesurfing",
"15": "Windsurfing",
"16": "Swimming",
"17": "VirtualBiking",
"18": "EBiking",
"19": "Velomobile",
"21": "Paddling",
"22": "Kayaking",
"23": "Rowing",
"24": "StandUpPaddling",
"25": "Surfing",
"26": "Crossfit",
"27": "Elliptical",
"28": "RockClimbing",
"29": "StairStepper",
"30": "WeightTraining",
"31": "Yoga",
"51": "Handcycling",
"52": "Wheelchair",
"53": "VirtualRunning",
}
func parseGPX(r io.Reader) error {
buf, err := ioutil.ReadAll(r)
if err != nil {
return err
}
g, err := gpx.ParseBytes(buf)
if err != nil {
return err
}
for _, t := range g.Tracks {
sport := t.Type
if strings.Contains(g.Creator, "Strava") {
if s, ok := stravaTypeCodes[sport]; ok {
sport = s
}
}
if len(t.Segments) == 0 || !includeSport(sport) {
continue
}
act := &activity{
sport: sport,
records: make([]*record, 0, len(t.Segments[0].Points)),
}
var p0, p1 gpx.GPXPoint
for _, s := range t.Segments {
if len(s.Points) == 0 {
continue
}
for i, p := range s.Points {
if len(act.records) == 0 {
p0 = p
}
p1 = p
act.records = append(act.records, &record{
ts: p.Timestamp,
lat: degreesToRadians(p.Latitude),
lon: degreesToRadians(p.Longitude),
})
if i > 0 {
r0, r1 := act.records[i-1], act.records[i]
act.distance += haversineDistance(r0.lat, r0.lon, r1.lat, r1.lon)
}
}
}
if len(act.records) == 0 ||
!includeTimestamp(p0.Timestamp, p1.Timestamp) ||
!includeDuration(p1.Timestamp.Sub(p0.Timestamp)) ||
!includeDistance(act.distance) {
continue
}
activities = append(activities, act)
}
return nil
}