Pomiar parametrów, Python

Wizualizacja trasy biegu na podstawie pliku GPX

1. Pliki GPX

GPX to  pliki XML ułatwiające wymianę danych pomiędzy oprogramowaniem używającym GPS. Mogą zawierać informacje o punktach na drodze( waypoints, wptType), szlakach (routes, rteType) oraz trasach (tracks, trkType).

Źródło: wikipedia

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:

  1. trkseg – segment trasy składa się z uporządkowanych punktów trasy (trkpt). Jest tworzony po nawiązaniu połączenia GPS
  2. 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.

Komentarze z Facebooka

Mogą Ci się również spodobać...

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *