2
2
from datetime import datetime
3
3
import pandas as pd
4
4
from math import degrees
5
+
5
6
import matplotlib .pyplot as plt
6
7
8
+ import webbrowser
9
+ import gmplot
10
+
7
11
from ..gpx_elements import Gpx
8
12
from ..gpx_parser import Parser
9
13
from ..gpx_writer import Writer
@@ -20,18 +24,41 @@ def __init__(self, file_path: str):
20
24
self .gpx : Gpx = self .parser .gpx
21
25
self .writer : Writer = Writer (self .gpx , precisions = self .parser .precisions , time_format = self .parser .time_format )
22
26
27
+ def name (self ) -> str :
28
+ """
29
+ Return activity name.
30
+
31
+ Returns:
32
+ str: Activity name.
33
+ """
34
+ return self .gpx .name ()
35
+
23
36
def nb_points (self ) -> int :
24
37
"""
25
- Compute the number of points in the GPX.
38
+ Return the number of points in the GPX.
26
39
27
40
Returns:
28
41
int: Number of points in the GPX.
29
42
"""
30
- nb_pts = 0
31
- for track in self .gpx .tracks :
32
- for track_segment in track .trkseg :
33
- nb_pts += len (track_segment .trkpt )
34
- return nb_pts
43
+ return self .gpx .nb_points ()
44
+
45
+ def bounds (self ) -> tuple [float , float , float , float ]:
46
+ """
47
+ Find minimum and maximum latitude and longitude.
48
+
49
+ Returns:
50
+ tuple[float, float, float, float]: Min latitude, min longitude, max latitude, max longitude
51
+ """
52
+ return self .gpx .bounds ()
53
+
54
+ def center (self ) -> tuple [float , float ]:
55
+ """
56
+ Return the coordinates of the center point.
57
+
58
+ Returns:
59
+ tuple[float, float]: Latitude and longitude of the center point.
60
+ """
61
+ return self .gpx .center ()
35
62
36
63
def distance (self ) -> float :
37
64
"""
@@ -236,18 +263,18 @@ def simplify(self, tolerance: float = 2):
236
263
epsilon = degrees (tolerance / EARTH_RADIUS )
237
264
self .gpx .simplify (epsilon )
238
265
239
- def plot (
266
+ def matplotlib_plot (
240
267
self ,
241
268
projection : str = None ,
242
269
title : str = "Track" ,
243
270
base_color : str = "#101010" ,
244
271
start_stop : bool = False ,
245
272
elevation_color : bool = False ,
246
- duration : bool = None ,
247
- distance : bool = None ,
248
- ascent : bool = None ,
249
- pace : bool = None ,
250
- speed : bool = None ,
273
+ duration : bool = False ,
274
+ distance : bool = False ,
275
+ ascent : bool = False ,
276
+ pace : bool = False ,
277
+ speed : bool = False ,
251
278
file_path : str = None ):
252
279
253
280
# Handle projection
@@ -304,4 +331,38 @@ def plot(
304
331
# Check path
305
332
plt .savefig (file_path )
306
333
else :
307
- plt .show ()
334
+ plt .show ()
335
+
336
+ def gmap_plot (
337
+ self ,
338
+ title : str = None ,
339
+ base_color : str = "#110000" ,
340
+ start_stop : str = False ,
341
+ zoom : float = 10.0 ,
342
+ file_path : str = None ,
343
+ open : bool = True ,
344
+ scatter : bool = False ,
345
+ plot : bool = True ):
346
+
347
+ # Convert to dataframe and compute center latitude and longitude
348
+ test_gpx_df = self .to_dataframe ()
349
+ center_lat , center_lon = self .center ()
350
+
351
+ # Create plotter
352
+ map = gmplot .GoogleMapPlotter (center_lat , center_lon , zoom )
353
+
354
+ # Plot and save
355
+ if title is not None :
356
+ map .text (center_lat , center_lon , self .name (), color = "#FFFFFF" )
357
+ if start_stop :
358
+ map .scatter ([self .gpx .tracks [0 ].trkseg [0 ].trkpt [0 ].lat ], [self .gpx .tracks [0 ].trkseg [0 ].trkpt [0 ].lon ], "#00FF00" , size = 5 , marker = True )
359
+ map .scatter ([self .gpx .tracks [- 1 ].trkseg [- 1 ].trkpt [- 1 ].lat ], [self .gpx .tracks [- 1 ].trkseg [- 1 ].trkpt [- 1 ].lat ], "#FF0000" , size = 5 , marker = True )
360
+ if scatter :
361
+ map .scatter (test_gpx_df ["latitude" ], test_gpx_df ["longitude" ], base_color , size = 5 , marker = False )
362
+ if plot :
363
+ map .plot (test_gpx_df ["latitude" ], test_gpx_df ["longitude" ], base_color , edge_width = 2.5 )
364
+ map .draw (file_path )
365
+
366
+ # Open
367
+ if open :
368
+ webbrowser .open (file_path )
0 commit comments