1. Pliki GPX
Zgodnie z [1] pliki GPX mają następujące zalety:
- Pozwalają na wymianę danych pomiędzy oprogramowaniem na różnych platformach Windows, MacOS, Linux, Palm i PocketPC.
- Mogą być z łatwością przekonwertowane do innych formatów.
- Są to pliki XML, więc wiele aplikacji wspierających ten format może je otworzyć.
- Można je rozszerzać o nowe właściwości.
Lista oprogramowania obsługującego GPX zostało przedstawiona na stronie: https://www.topografix.com/gpx_resources.asp .
W poniższym artykule wykorzystano pliki GPX pochodzące ze zbioru udostępnionego do badań naukowych [2]. Analizowane GPX zawierają dane o trasach (trk) w których można wyróżnić następujące elementy:
- trkseg – segment trasy składa się z uporządkowanych punktów trasy (trkpt). Jest tworzony po nawiązaniu połączenia GPS
- trkpt – punk trasy zawiera długość i szerokość geograficzną (lon, lat), wzniesienie terenu (ele), czas (time) oraz inne metadane Garmina (extension, gpxtpx) takie, jak tętno (hr) oraz temperatura (atemp).
2. Wczytywanie danych
Do wczytania plików GPX użyto parsera Python gpxpy. Wczytane dane zostały umieszczone w dobrym do analizy bloku danych „data frame” z modułu pandas.
import gpxpy from pathlib import Path import pandas as pd dataFolder = Path("SportData") gpx = gpxpy.parse(open(dataFolder / "Athlete2/1.gpx"))
Następnie sprawdzono ile tras, segmentów i punktów zawiera plik.
Zgodnie z powyższym plik zawiera 1 trasę składającą się z 1 segmentu i 3366 punktów. Przeniesienie danych do bloku „data frame” wykonano w pętli.
segment = gpx.tracks[0].segments[0] df = pd.DataFrame(columns=['długość', 'szerokość', 'wzniesienie', 'czas', 'tętno','temperatura','prędkość']) for point_idx, point in enumerate(segment.points): df = df.append({'długość': point.longitude, 'szerokość' : point.latitude, 'wzniesienie' : point.elevation, 'czas' : point.time, 'tętno' : point.extensions[0][1].text, 'temperatura' : point.extensions[0][0].text, 'prędkość' : segment.get_speed(point_idx)}, ignore_index=True)
Sprawdzono typy kolumn
df.dtypes
oraz wymiary bloku danych
df.shape
Wyświetlamy 5 wierszy z naszego bloku danych, aby zweryfikować czy wygląda poprawnie.
df.head()
3. Wizualizacja
Trasę z pliku można przedstawić na mapie Google. Korzystanie w oprogramowaniu zewnętrznym z mapy Google obecnie jest płatne, a szczegółowe informacje można znaleźć w tym linku .
Na początku trzeba utworzyć pustą mapę (13 – to przybliżenie, dobrane odpowiednio do trasy, można je zmieniać za pomocą +,-).
min_szer = min(df['szerokość']) max_szer = max(df['szerokość']) min_dl = min(df['długość']) max_dl = max(df['długość']) sportMap = gmplot.GoogleMapPlotter( min_szer + (max_szer - min_szer) / 2, min_dl + (max_dl - min_dl) / 2, 13)
Następnie za pomocą funkcji plot, podając kolor oraz szerokość krawędzi nanosimy na przygotowaną w poprzednim kroku mapę i zapisujemy ją w pliku html.
sportMap.plot(df['szerokość'], df['długość'], 'blue', edge_width=2) sportMap.draw('athlete2track.html')
Do naniesienia trasy można wykorzystać również funkcje scatter.
sportMap.scatter(df['szerokość'], df['długość'], 'red', size=7, marker=False) sportMap.draw('athlete2track2.html')
W niniejszym opracowaniu korzystano z wersji bezpłatnej google maps, dlatego wyświetla się napis „For development purposes only”.
Źródła
[1] https://www.topografix.com
[2] S. Rauter, I. Jr. Fister, I. Fister. „A collection of sport activity files for data analysis and data mining.” Technical report 0101, University of Ljubljana and University of Maribor 2016a, 2016.